最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享。
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
普通的登录是写入session,每次获取session看看是否有登录就可记录用户的登录状态。
同理多个站点用一个凭证,可以用分布式session,我们可以用redis实现分布式session,来实现一个简单的统一登录demo
我们在本地IIS建立三个站点
登录验证的站点
站点1
站点2
修改host文件C:\Windows\System32\drivers\etc下
127.0.0.1
127.0.0.1 test1.a.com
127.0.0.1 test2.a.com
127.0.0.1 sso.a.com
具体实现原理,当用户第一次访问应用系统test1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统test2和应用系统test3了。
项目结构
二、代码实现sso.a.com登录验证站点
SSO demo 用 户: 密 码:
代码:
Index : System.Web.UI.Page { StrTip { get; set; } public string UserName { get; set; } public string PassWork { get; set; } protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack) { ValidateUser(); } } ValidateUser() { ]; if (username.Equals("")) { StrTip = ; return; } ]; if (password.Equals("")) { StrTip = ; return; } (username == && password == ) { UserInfo userInfo=new UserInfo() { UserName = ,PassWord = ,Info = }; token = Guid.NewGuid().ToString(); //写入token Common.Common.AddCookie(, token, Int32.Parse(ConfigurationManager.AppSettings[])); //写入凭证 RedisClient client = ], 6379); client.Set<UserInfo>(token, userInfo); (Request.QueryString[] != null) { Response.Redirect(Request.QueryString[].Decrypt(), false); } else { Response.Redirect(ConfigurationManager.AppSettings[], false); } } else { StrTip = ; return; } } }
配置文件:
注销代码:
); Common.Common.AddCookie(,tokenValue,-1); HttpContext.Current.Response.Redirect(ConfigurationManager.AppSettings[]);
其他站点验证是否登录的代码:PassportService
public class PassportService { TokenReplace() { string strHost = HttpContext.Current.Request.Url.Host; string strPort = HttpContext.Current.Request.Url.Port.ToString(); , strHost, strPort, HttpContext.Current.Request.RawUrl); url = Regex.Replace(url, , "", RegexOptions.IgnoreCase); ] + + url.Encrypt(); } public void Run() { ); RedisClient client = ], 6379); UserInfo userInfo = client.Get<UserInfo>(token); if (userInfo == null) { Common.Common.AddCookie(, token, -1); //令牌错误,重新登录 HttpContext.Current.Response.Redirect(TokenReplace(), false); } else { Common.Common.AddCookie(, token, Int32.Parse(ConfigurationManager.AppSettings[])); } } public UserInfo GetUserInfo() { ); RedisClient client = ], 6379); return client.Get<UserInfo>(token) ?? new UserInfo(); } }
三、最后看下效果图 四、代码下载这里只做了一个简单的实现,提供了一个简单的思路,具体用的时候可以继续完善。
代码下载:
https://yunpan.cn/cPAtDehnv8bXr (提取码:1a4a)
五、加关注
如果本文对你有帮助,请点击【右下角推荐】和【左上角关注】