完整的单点登录功能

目的:

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

 

代码附件下载:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值