シングル・サインオンのログイン資格情報を最初のシステムへの認証アクセスに認証されたログイン名、最後のログイン名を取得し、セッションを作成し、その後、統一されたポータルを得ます。これは、暗号化されたタイムスタンプとキーを含むいくつかのこのような文字列に応じて、また、大会方式で、合意された方法を取得したデータを復号します。トークンを介して、昔ながらのシングルポイントのドメイン名がクッキーに保存されている、モードは、クロスドメインまたはIPモードをサポートしていない、一定の制限があります。新しい単一点リダイレクション、ポータルシステムの使用を自動的にアプリケーション・アクセス・インタフェースによって結合する、またはIPプロトコル自体は、限定されません。
以下、いくつかの一般的な方法は、単一のポイントを合計します。
CASの着陸
CASの着陸は、アドレスと終了アドレスを確認し、着陸のアドレスが含まれています。アクセスシステムは、第一サービス識別パラメータでアプリケーションを登録する必要があります。
サンプルコードはC#で書かれている、他の言語を書き換えることができます。基礎となる原理はパケットスニファの方法を用いて分析することができます。
セッションが存在しない場合には、着陸のためのCASの着陸アドレス、パラメータのサービスを訪問するために行ってきました。認証が成功すると、CASは、アプリケーションへのコールバックサービスやチケットのパラメータに対処します。チケットを検証するために実施し、サービスを取得することによって、成功したリターンであるユーザーのログイン名を含むXMLレスポンスを確認します。
フォームの一般CASアドレス:
ログイン:...... / CASディレクトリ/ログイン
確認します...... / CASディレクトリ/ proxyValidate
ログアウト:...... / CASディレクトリ/ログアウト
公共の文字列はGetHost()
{
ブールHTTPS =でRequest.ServerVariables [ "HTTPS"] TOLOWER()に等しい( "オン")。
文字列のホスト=でRequest.ServerVariables [ "HTTP_HOST"];
リターン(https "のhttps://で": "のhttp://"?)+ホスト。
}
公共の文字列getEmployeeID()
{
ストリングloginaspx = HttpUtility.UrlEncode(はGetHost()+でRequest.ServerVariables [ "PATH_INFO"])。
文字列のチケット=場合、Request.QueryString [ "チケット"];
もし(チケット== nullの|| ticket.Length == 0)
{
Response.Redirect(loginServer + + loginaspx "サービス=?");
ヌルを返します。
}
"?チケット=" 文字列validateUrl = validateServer + +チケット+ "&サービス=" + loginaspx。
ServicePointManager.ServerCertificateValidationCallback =新しいSystem.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult)。
//リターンチケット検証、サーバーによって返されたユーザー名へのアクセス
試します
{
StreamReaderを読者が新しいStreamReaderを=(新しいWebクライアントを()OpenRead(validateUrl)。);
ストリングRESP = Reader.ReadToEnd()。
名前テーブルNT =新しい名前テーブル();
XmlNamespaceManager nsmgr =新しいてXmlNamespaceManager(NT);
XmlParserContextコンテキスト=新しいXmlParserContext(ヌル、nsmgr、ヌル、XmlSpace.None)。
XmlTextReaderはリーダー=新しいXmlTextReaderクラス(それぞれ、XmlNodeType.Element、コンテキスト)。
文字列はuid = NULL;
しばらく(reader.Read())
{
もし(reader.IsStartElement())
{
文字列タグ= reader.LocalName。
もし(タグ==「ユーザー」)
UID = reader.ReadString()。
}
}
reader.Close();
UIDを返します。
}
キャッチ(例外EE)
{
ヌルを返します。
}
}
OAuth 着陸
OAuthの着陸アプローチは、インターフェースを提供するポータルは、一般的にJSONに応答して情報を取得するために、合意APPKEY、appPasswordを提供します。CASと同様に、最初のステップaccessTokenはまだインタフェースを介して取得した後、accessTokenは、ログイン名を取得確認する必要があります。
以下は、各ログイン認証の繰り返しを避けるために、ユーザーのオンラインポータルを得る方法を使用し、C#のコード例です。
パブリッククラスJsonObjectAccessToken
{
公共int型。
公共の文字列access_tokenは、
}
パブリッククラスJsonObjectSession
{
公共の文字列のステータス。
公共の文字列DESC;
公共辞書<文字列、文字列> OBJ。
}
公共の文字列getEmployeeID()
{
ストリングAPPKEY = configNode.Attributes [ "APPKEY"]の値。
ストリングappPassword = configNode.Attributes [ "appPassword"]の値。
文字列サーバ名= configNode.Attributes [ "serverNameの"]の値;. //ローカルログエントリ
ストリングredirectUrl =ホスト名+でRequest.ServerVariables [ "PATH_INFO"]。文字列のチケット=場合、Request.QueryString [ "コード"];
もし(チケット== nullの|| ticket.Length == 0)
{
//ポータルが上陸した場合、戻り直接ログイン情報
ストリングloginUserResponse = UserInfo.Text.Replace( "コールバック("、 "").Replace( ")"、 "");
もし(loginUserResponse!= nullの&& loginUserResponse.Equals( "")== false)を
{
JsonObjectSession loginUserObject = JsonConvert.DeserializeObject <JsonObjectSession>(loginUserResponse)。
もし(loginUserObject!= nullの&& loginUserObject.status.Equals( "1"))
{
リターンloginUserObject.obj [ "LoginNameに"];
}
}
(セッション[ "チケット"]!= null)の場合
{
チケット=セッション[ "チケット"] ToStringメソッド()。
}
もし(チケット== nullの|| ticket.Length == 0)
{
Response.Redirect(サーバー+ "/のOAuth2 / OAuthのCLIENT_ID =" + APPKEY + "&REDIRECT_URI =" + redirectUrl + "&forcelogin = FALSE&状態= STATE")。
ヌルを返します。
}
}
セッション[ "チケット"] =チケット;
文字列validateUrl = serverNameの+ "?/のOAuth2 / access_tokenはCLIENT_ID =" + APPKEY + "&client_secret =" + appPassword + "&REDIRECT_URI =" + redirectUrl + "&コード=" +チケット。
//リターンチケット検証、サーバーによって返されたユーザー名へのアクセス
試します
{
ストリングaccessTokenResponse =てgetResponse(validateUrl)。
JsonObjectAccessToken accessTokenObject = JsonConvert.DeserializeObject <JsonObjectAccessToken>(accessTokenResponse)。
(accessTokenObject!= null)の場合
{
(accessTokenObject.type == 1)であれば
{
文字列accessToken = accessTokenObject.access_token。
//要求ユーザ情報
文字列sessionUrl = serverNameの+ "/SSOService.asmx/user_base_info?access_token=" + accessToken。
ストリングsessionResponse =てgetResponse(sessionUrl).Replace( "("、 ")")(交換してください。 ""、 "");
JsonObjectSession sessionObject = JsonConvert.DeserializeObject <JsonObjectSession>(sessionResponse)。
もし(sessionObject.status.Equals( "1"))
{
リターンsessionObject.obj [ "UserLoginName"];
}
}
(!セッション[ "チケット"] = NULL)Session.Remove( "チケット")であれば、
}
}
キャッチ(例外e)
{
Response.Writeを(e.StackTrace)。
}
ヌルを返します。
}
公共の静的な文字列getTimestamp()
{
可能System.DateTimeのstartTime = TimeZone.CurrentTimeZone.ToLocalTime(新規のSystem.DateTime(1970、1、1、0、0、0、0));
長いT =(DateTime.Now.Ticks - startTime.Ticks)/ 10000;
リターンt.ToString();
}
公共の文字列てgetResponse(文字列のURL)
{
ストリームストリーム= NULL;
StreamReaderをリーダー= NULL;
文字列responseMsg = "";
試します
{
HttpWebRequestの要求=(HttpWebRequestの)HttpWebRequest.Create(URL); request.Method = "GET"; //以下は、カスタムリクエストヘッダすることができ
request.ContentType = "テキスト/ JSON;のcharset = UTF-8";
request.Timeout = 1000;
request.Referer =ホスト名。
HttpWebResponseの応答=(HttpWebResponseの)request.GetResponse();
ストリーム= response.GetResponseStream()。
リーダー=新しいStreamReaderを(ストリーム、System.Text.Encoding.GetEncoding( "UTF-8")); //セルフトランスコーディング
responseMsg = Reader.ReadToEnd(); //この決定は確かにEndofStream例外を表示されません。
}
キャッチ
{
}
最後に
{
もし(リーダー!= NULL)
{
Reader.Close();
Reader.Dispose();
}
リーダー= NULL;
(ストリーム!= null)の場合
{
stream.Close();
stream.Dispose();
}
ストリーム= NULL;
}
responseMsgを返します。
}
カスタム暗号化
公共の文字列getMD5(文字列平文)
{
System.Security.Cryptography.MD5キー= System.Security.Cryptography.MD5.Create()。
バイト[]バイト= key.ComputeHash(System.Text.Encoding.UTF8.GetBytes(平文))。
System.Text.StringBuilderビルダー=新しいSystem.Text.StringBuilder();
foreachの(バイト_byteのバイト)
{
builder.Append(_byte.ToString( "×2")TOUPPER());
}
リターンbuilder.ToString();
}
ストリング検証=場合、Request.QueryString [「確認」]。
ストリングのuserName =場合、Request.QueryString [ "userNameに"]。
ストリングstrSysDatetime =場合、Request.QueryString [ "strSysDatetime"]。
ストリングjsName =場合、Request.QueryString [ "jsName"]。
文字列のキー= ......。
(getMD5(ユーザ名+キー+ strSysDatetime + jsName).Equals(検証))の場合
{
ユーザ名を返します。
}
新規ユーザーと削除ユーザーを含む同期を達成するためのゲートウェイと、各アプリケーションシステム間のアクセスを占めています。比較的完全なシステムは、また、同期パスワードを伴います。
ウェイシングルポイント性質は、偽造や着陸をシミュレートすることは非常に安全ではありません。安全性は最も重要な部分の検証です。ユーザー名と、戻って行くことを許されます。