使用面向对象的、完整的单点登录功能
目的:
1.单点登录,是一个用得很多,也是大家比较常见的登录方式了。我在这里写这篇文章的目的,是因为我的这个单点登录里,用了简单的设计模式。供大家参考。
2.这篇文章的附件代码,是完整的单点登录代码。您可以直接下载,嵌入您的系统即可直接使用。这是基于前些文章,部分网友提出的要提供代码下载。所以,我采纳了这个建议,非常感谢各位朋友。
配置:
在web.config中,需要在<system.web>节点中,添加如下配置:
<authentication mode="Forms"> <forms loginUrl="http://user.ccnf.com/login.aspx" timeout="2880" name=".CCNFAUTH" domain=".ccnf.com" defaultUrl="http://www.ccnf.com/" enableCrossAppRedirects="true"/> </authentication> <machineKey validationKey="ED757E9190083A50853834A0508738AC58A89661" decryptionKey="B8262DEBC6D1D33F1932AC3EE9C4325E6008A928077B73E6" validation="SHA1"/>
其中:machineKey的生成,网上有代码,请自行去google或baidu。关于authentication mode="Forms"的验证方式,请查阅msdn。
在Global.asax全局文件中,加入如下代码:
///<summary> /// 在验证完成后发生 ///</summary> ///<param name="sender"></param> ///<param name="e"></param> ///<author>马志远(Marc)</author> void Application_AuthenticateRequest(Object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; HttpContext context = app.Context; if (context.User != null) { if (context.Request.IsAuthenticated == true) { FormsIdentity identity = (FormsIdentity)context.User.Identity; FormsAuthenticationTicket ticket = identity.Ticket; string userData = ticket.UserData; string[] roles = userData.Split(','); context.User = new System.Security.Principal.GenericPrincipal(identity, roles); } } }
///<summary> /// 发送身份请求时触发 ///</summary> ///<param name="sender"></param> ///<param name="e"></param> ///<author>马志远(Marc)</author> protected void Application_PostAuthenticateRequest(object sender, EventArgs e) { HttpContext ctx = ((HttpApplication)sender).Context; HttpRequest req = ctx.Request; HttpResponse resp = ctx.Response; if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(req.AppRelativeCurrentExecutionFilePath, ctx.User, req.RequestType)) { HttpContext.Current.Response.Redirect(String.Format("{0}?ReturnUrl={1}", FormsAuthentication.LoginUrl, req.Url.AbsoluteUri)); } }
///<summary> /// 发送身份请求时触发 ///</summary> ///<param name="sender"></param> ///<param name="e"></param> ///<author>马志远(Marc)</author> protected void Application_PostAuthenticateRequest(object sender, EventArgs e) { HttpContext ctx = ((HttpApplication)sender).Context; HttpRequest req = ctx.Request; HttpResponse resp = ctx.Response; if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(req.AppRelativeCurrentExecutionFilePath, ctx.User, req.RequestType)) { HttpContext.Current.Response.Redirect(String.Format("{0}?ReturnUrl={1}", FormsAuthentication.LoginUrl, req.Url.AbsoluteUri)); } }
文件目录结构:
用法:
1.登录时调用的方法在Passport.cs文件中。调用的代码如下:
CCNF.Tool.Authentication.Passport.GetInstance().SetCookie(user.PersonId);
通过上面的代码调用,那么用户即可以登录成功了。
2.登录成功后,要取得用户的cookie数据,比如用户名、昵称等。这些方法写在了User.cs中。
调用代码为:
CCNF.Tool.Authentication.User.GetInstance().AdministratorId等。
3.退出系统的代码在SignOut.cs的代码中。
CCNF.Tool.Authentication.SignOut.Logout(returnurl);
使用上述代码,即可退出系统。
知识点:
其中Passport.cs文件用到了单例模式。单例模式代码如下:
///<summary> /// 登录验证 ///</summary> ///<creator>马志远(Marc)</creator> public sealed class Passport : AuthenticationAbstract { private static readonly Passport instance = new Passport();
///<summary> /// 构造函数 ///</summary> ///<author>马志远(Marc)</author> private Passport() {
}
static Passport() { }
public static Passport GetInstance() { return instance; }
///<summary> /// 构造函数 ///</summary> ///<author>马志远(Marc)</author> private Passport() {
}
static Passport() { }
public static Passport GetInstance() { return instance; }
http://www.cnblogs.com/mazhiyuan/archive/2012/05/16/2503484.html
代码附件下载:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?