使用面向对象的、完整的单点登录功能

目的:

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));         }     }
复制代码

文件目录结构:

用法:

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;         }
复制代码

 http://www.cnblogs.com/mazhiyuan/archive/2012/05/16/2503484.html

代码附件下载:

原文地址:https://www.cnblogs.com/binb/p/2506971.html