使用asp.net实现单点登陆(SSO)功能

单点登陆技术广泛应用于把分布在不同服务器的各个网站之间的身份识别及授权认证联系起来,解决用户重复登陆的操作问题。

假设有四个网站,如下图所示:

主站:用于产生验证用户授权凭证的服务器 http://www.mainsite.com
分站:http://www.subsite1.com、http://www.subsite2.com、http://www.subsite3.com
凭证: 用户在mainsite登陆后将产生的有效授权数据标识,标识可以存放在主站的数据库。
令牌:由mainsite.com产生并颁发给个子站的唯一标识。

单点登陆的实现过程

1、假设匿名用户访问子站(如:http://www.subsite1.com/products.html)上的一个授权页面,系统会先跳转到 主站http://www.mainsite.com/login.html,用户登陆后,系统产生登陆认证后的令牌,然后自动把令牌带回登陆之前的子 站,此时子站会根据用户由主站带回来的令牌信息进行认证,认证成功后把认证信息以一定的时效性保存在子站或Cookie。

2、假设用户已经在subsite1.com登陆了,但他要去访问另一个子站(如:subsite2.com),由于用户已经在 subsite1.com获得了登陆授权,因此subsite1.com将自动向mainsite.com发送受权认证,认证成功 后,subsite2.com会保留用户的凭证。

类设计如下:

1、通行证实体类:

public class Passport
{
    public string Account { get; set; }
    public string Password { get; set; }
    public Passport(string account, string password)
    {
        this.Account = account;
        this.Password = password;
    }
}

2、 通行证业务类:

/// <summary>
/// SSOHelper
/// </summary>
public class SSOHelper
{
    /// <summary>
    /// 登陆,登陆成功后将产生令牌
    /// </summary>
    /// <param name="passport">通行证对象</param>
    /// <param name="token">令牌</param>
    /// <returns>返回登陆结果</returns>
    public int Login(Passport passport, out string token)
    {
        token = null;
        //  业务逻辑
        return default(int);
    }
    public SSOHelper()
    {    }
}

3、登陆认证示例:

假设用户由http://www.subsite1.com/products.html申请登陆,那么系统将跳转到www.mainsite.com的登陆认证页面,用户输入通行证信息并成功认证后,系统将产生令牌,然后自动引导用户返回认证之前的页面。

private void Login() // 主站登陆
{
    Passport passport = new Passport("tom", "abc123");
    string taken = string.Empty;
    int iResult = new SSOHelper().Login(passport, out taken);
    if (0 == iResult) // 主站认证通过
    {
        // 注:taken务必做加密处理
        Response.Redirect(string.Format("http://www.subsite1.com/products.html?t=", taken));
    }
}

private void CertificateAuthority() //  子站身份验证
{
    string taken = Request.QueryString["t"];
    if (null != taken && 0 != taken.Length)
    {
        // 解密taken,唯一标识已经存在于数据库
    }
}

4、注销登陆

清空各个站点的登陆信息即可。

你可能感兴趣的:(asp.net)