.Net 기반 단일 로그 인(SSO)솔 루 션 구현
7177 단어 sso 단일 로그 인
//
string tokenValue = Guid.NewGuid().ToString().ToUpper();
HttpCookie tokenCookie = new HttpCookie("Token");
tokenCookie.Values.Add("Value", tokenValue);
tokenCookie.Domain = "passport.com";
Response.AppendCookie(tokenCookie);
홈 페이지 증빙:홈 페이지 증빙 서 류 는 하나의 관계 표 로 세 개의 필드 를 포함한다.영패,증빙 데이터,기한 이 지난 시간 이다.선택 할 수 있 는 여러 가지 실현 방식 이 있 습 니 다.신뢰성 을 요구 하면 데이터 베 이 스 를 사용 하고 성능 을 요구 하면 Cache 를 사용 합 니 다.DEMO 에서 저 는 Cache 중의 DataTable 을 사용 합 니 다.다음 코드 에서 보 듯 이
/// <summary>
///
/// </summary>
/// <remarks>
/// ----------------------------------------------------
/// | token( ) | info( ) | timeout( ) |
/// |--------------------------------------------------|
/// </remarks>
private static void cacheInit()
{
if (HttpContext.Current.Cache["CERT"] == null)
{
DataTable dt = new DataTable();
dt.Columns.Add("token", Type.GetType("System.String"));
dt.Columns["token"].Unique = true;
dt.Columns.Add("info", Type.GetType("System.Object"));
dt.Columns["info"].DefaultValue = null;
dt.Columns.Add("timeout", Type.GetType("System.DateTime"));
dt.Columns["timeout"].DefaultValue = DateTime.Now.AddMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]));
DataColumn[] keys = new DataColumn[1];
keys[0] = dt.Columns["token"];
dt.PrimaryKey = keys;
//Cache *2
HttpContext.Current.Cache.Insert("CERT", dt, null, DateTime.MaxValue, TimeSpan.FromMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]) * 2));
}
}
지점 증명:지점 증명 서 는 주로 중복 검증 시 네트워크 의 상호작용 을 줄 이 는 데 사 용 됩 니 다.예 를 들 어 사용자 가 지점 a 에 로그 인 한 적 이 있 습 니 다.그 가 지점 a 를 다시 방문 할 때 토 큰 을 사용 하여 홈 페이지 에 가서 검증 할 필요 가 없습니다.지점 a 는 이미 이 사용자 의 증거 가 있 기 때 문 입 니 다.지점 별 증빙 은 상대 적 으로 간단 하 며 Session,Cookie 를 사용 해도 됩 니 다.지점 SSO 페이지 기본 클래스:지점 에서 SSO 페이지 를 사용 하면 문장 시작 프로 세 스 맵 과 같은 일련의 논리 적 판단 처 리 를 할 수 있 습 니 다.만약 여러 페이지 가 있다 면 각 페이지 에 이러한 논 리 를 쓸 수 없습니다.OK.그러면 이 논 리 를 하나의 기본 클래스 로 봉 하고 SSO 페이지 를 사용 하여 이 기본 클래스 를 계승 하면 됩 니 다.다음 코드 에서 보 듯 이
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
namespace SSO.SiteA.Class
{
/// <summary>
///
/// </summary>
public class AuthBase : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
if (Session["Token"] != null)
{
//
Response.Write(" , , !");
}
else
{
//
if (Request.QueryString["Token"] != null)
{
if (Request.QueryString["Token"] != "$Token$")
{
//
string tokenValue = Request.QueryString["Token"];
// WebService
SSO.SiteA.RefPassport.TokenService tokenService = new SSO.SiteA.RefPassport.TokenService();
object o = tokenService.TokenGetCredence(tokenValue);
if (o != null)
{
//
Session["Token"] = o;
Response.Write(" , , !");
}
else
{
//
Response.Redirect(this.replaceToken());
}
}
else
{
//
Response.Redirect(this.replaceToken());
}
}
// ,
else
{
Response.Redirect(this.getTokenURL());
}
}
base.OnLoad(e);
}
/// <summary>
/// URL
/// URL
/// </summary>
/// <returns></returns>
private string getTokenURL()
{
string url = Request.Url.AbsoluteUri;
Regex reg = new Regex(@"^.*\?.+=.+$");
if (reg.IsMatch(url))
url += "&Token=$Token$";
else
url += "?Token=$Token$";
return "http://www.passport.com/gettoken.aspx?BackURL=" + Server.UrlEncode(url);
}
/// <summary>
/// URL
/// URL
/// </summary>
/// <returns></returns>
private string replaceToken()
{
string url = Request.Url.AbsoluteUri;
url = Regex.Replace(url, @"(\?|&)Token=.*", "", RegexOptions.IgnoreCase);
return "http://www.passport.com/userlogin.aspx?BackURL=" + Server.UrlEncode(url);
}
}//end class
}
사용자 가 종료 합 니 다.사용자 가 종료 할 때 각각 홈 페이지 증빙 과 현재 지점 증명 서 를 비 웁 니 다.A 사이트 의 종 료 를 요구 하면 B,C 사이트 도 종 료 됩 니 다.인 터 페 이 스 를 확장 하여 모든 지점 증명 서 를 비 울 수 있 습 니 다.홈 페이지 만 료 증명서/토 큰 제거:정시 제거(DataTable)Cache["CERT"]에서 timeout 필드 가 현재 시간의 기록 을 초과 합 니 다.