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


    目的:

    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;
            }

    代码附件下载:

    本代码为全部代码,直接下载嵌入项目即可使用。

    请点击这里进行下载

    关于作者:

    马志远(Marc),1981年,2002年湖北大学肄业,现蜗居广州。2004年学习编程,至今已经有9年的编程经验,长期从事asp.net B/S方面的开发和设计,擅长用人和任事、指挥和管理、C#.net B/S技术。在项目解决方案上、在项目性能和扩展等上,具有深强的能力。您可以使用mazhiyuan1981@163.com与我取得联系。

  • 相关阅读:
    CentOS 7 rpm包部署kubernetes 1.20
    基于ipset对大量IP进行封禁(Iptables)
    RPM打包指南
    MySQL主从一致性检查
    基于Docker+Jenkins+Git的发布环境
    MySQL管理工具集MySQL Utilities | 利用frm和ibd文件恢复表数据
    MySQL日志解析工具资料汇总
    MySQL之—分库分表的技巧
    MySQL之查询重复记录、删除重复记录方法大全
    一个爬虫
  • 原文地址:https://www.cnblogs.com/mazhiyuan/p/2503484.html
Copyright © 2020-2023  润新知