.Net 기반 단일 로그 인(SSO)솔 루 션 구현

7177 단어 sso 단일 로그 인
며칠 전에 한 친구 가 저 에 게 단일 로그 인 을 도와 달라 고 했 습 니 다.사실은 이 개념 은 이미 잘 알 고 있 지만 실제 응용 이 적어 서 최근 에 한가 하기 때문에 본 고 를 통 해 SSO 해결 방안 을 상세 하 게 설명 하기 로 했 습 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.SSO 는 솔 루 션 이 많 지만 검색 결 과 는 실 망 스 럽 다.대부분 서로 옮 겨 싣 고 주마간산 식 으로 묘사 된다.잡담 은 적 게 하고 본론 으로 들 어가 면 집중 검증 방식 을 사용 하고 여러 사이트 에서 Passport 검증 에 집중 하 는 것 이 제 생각 입 니 다.아래 그림 에서 보 듯 이 명확 하 게 묘사 하기 위해 먼저 몇 개의 명 사 를 정의 하고 본 고 에서 나타 난 부분 은 모두 다음 과 같은 의미 이다.홈 페이지:Passport 집중 인증 서버http://www.passport.com/ 。 지점:http://www.a.com/、http://www.b.com/、http://www.c.com/ 증빙:사용자 가 로그 인 한 후에 발생 하 는 데이터 표 지 는 권한 을 수 여 받 은 사용 자 를 식별 하 는 데 사용 되 고 여러 가지 방식 으로 사용 할 수 있 습 니 다.DEMO 에서 메 인 사이트 에서 저 는 Cache 를 사용 하고 지점 에서 Session 을 사용 합 니 다.영패:Passport 에서 각 지점 에서 유통 할 수 있 는 유일한 표 지 를 발급 합 니 다.OK.현재 단일 지점 로그 인 과정 을 설명 합 니 다.상황 1.익명 사용자:익명 사용자 가 지점 a 의 권한 수여 페이지 를 방문 합 니 다.먼저 홈 페이지 로 이동 하여 사용자 에 게 계 정,비밀 번 호 를 입력 하여 로그 인 하 게 합 니 다.검증 을 통과 한 후에 홈 사이트 증빙 서 류 를 생 성 하 는 동시에 토 큰 을 생 성하 고 지점 a 로 이동 합 니 다.이때 지점 a 는 사용자 가 토 큰 을 가지 고 있 는 것 을 감지 합 니 다.그래서 영패 로 다시 홈 페이지 에 가서 사용자 증명 서 를 얻 고 성공 을 거 둔 후에 사용자 가 이 권한 수여 페이지 에 접근 할 수 있 도록 합 니 다.이 동시에 지점 a 의 로 컬 증명 서 를 생 성 합 니 다.이 사용자 가 다시 검증 해 야 할 때 먼저 로 컬 증명 서 를 검사 하여 네트워크 의 상호작용 을 줄 일 것 입 니 다.상황 2.지점 a 에 로그 인 한 사용자 가 지점 b 를 방문 합 니 다.사용자 가 지점 a 에 로그 인 했 기 때문에 토 큰 을 가지 고 있 기 때문에 지점 b 는 토 큰 으로 홈 페이지 에 가서 사용자 증명 서 를 얻 고 성공 한 후에 사용자 가 권한 수여 페이지 에 접근 할 수 있 습 니 다.동시에 지점 b 의 현지 증명 서 를 생 성 합 니 다  디자인 이 완 료 된 후에 그 다음은 방안 이 실현 하 는 관건 적 인 부분 이다.토 큰:토 큰 은 홈 페이지 에서 발급 하고 홈 페이지 에서 토 큰 을 발급 하 는 동시에 사용자 증빙 서 류 를 생 성 하 며 토 큰 과 사용자 증빙 간 의 대응 관 계 를 기록 하여 사용자 가 제공 하 는 토 큰 에 따라 대응 하 는 증빙 서 류 를 작성 한다.토 큰 은 각 도 메 인 지점 에서 유통 되 어야 하기 때문에 DEMO 에서 토 큰 은 메 인 사이트 의 Cookie 를 사용 하고 Cookie.Domain="passport.com"을 지정 합 니 다.각 지점 은 어떻게 홈 페이지 의 쿠키 를 공유 합 니까?지점 Redirect 에서 홈 페이지 로 이동 한 후 이 페이지 에서 Cookie 를 읽 고 URL 매개 변수 로 전송 하면 됩 니 다.DEMO 코드 에서 상세 한 실현 을 볼 수 있 습 니 다.물론 더 좋 은 토 큰 실현 방식 이 있 는 사람 도 꺼 내 공유 할 수 있 습 니 다
 
//
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 필드 가 현재 시간의 기록 을 초과 합 니 다.

좋은 웹페이지 즐겨찾기