夜微凉、的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.Net身份验证主要是分为三种 Windows | Forms | Passport 其中Froms在项目中用的最多。

 

1、Windows身份验证

       

2、Froms验证

简单的身份验证

Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端。

服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了。

  要验证身份需要在 Web.xml进行配置  

<authentication mode="Forms">
      <forms defaultUrl="~/Home/Index" loginUrl="~/Account/Index" timeout="30"></forms>
 </authentication> 
loginUrl:在没有通过身份验证的情况下,跳转到的登录页面 
defaultUrl:通过身份验证以后,在没有指向页的时候跳到的页面
timeout:超时时间(分钟)
    [AllowAnonymous]
    public class AccountController : BaseController
    {  
        /// <summary>
        /// 简单的Forms登录
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Login(Entity.T_UserModel model)
        {
            if (ModelState.IsValid)
            {
                //写入cookie票据
                FormsAuthentication.SetAuthCookie(model.Account, false);    
                return Redirect(FormsAuthentication.DefaultUrl);
            }
            return View("Index");
        }
        
        /// <summary>
        /// 退出登录
        /// </summary>
        /// <returns></returns>
        public ActionResult SignOut()
        {
            FormsAuthentication.SignOut();
            return View();
        }

  <forms>标签中的loginUrl指定如果没有找到任何有效的身份验证 Cookie,为登录将请求重定向到的 URL。默认值为 default.aspx。loginUrl指定的页面就是用来验证用户身份的,一般此页面提供用户输入用户名和密码,

用户提交后由程序来根据自己的需要来验证用户的合法性(大多情况是将用户输入信息同数据库中的用户表进行比较),如果验证用户有效,则生成同此用户对应的身份验证票,写到客户端的Cookie,最后将浏览器重定向到用户初

试请求的页面.一般是用FormsAuthentication.RedirectFromLoginPage 方法来完成生成身份验证票,写回客户端,浏览器重定向等一系列的动作. 

  上面的 Login() 方法实现了用户登录,

  在需要通过权限验证的控制器添加 [Authorize] 过滤器,当没有经过授权的用户请求URL的时候会产生拦截,并重定向到 配置文件节点<Authentication />节点指向 loginUrl 登录页面, 

   [AllowAnonymous]  (过滤器添加在 登录Controller,否则将无法跳转到登录方法。

  1、登录:调用  FormsAuthentication.SetAuthCookie( );  

  2、注销:调用  FormsAuthentication.SignOut();

保护受限制的文件或页面                                                                                                                                                   

  在咱们的网站里,有的文件或者页面可能会允许所有的用户访问,有的可能需要经过授权的用户访问,有的可能只能特定角色的用户才能访问。这些页面或者文件受到限制(默认情况下只针对ASP相关的文件起作用,js 和HTML不起作用,需要单独设置),

  为了保护这些有着权限要求的页面,.Net 提供了设置的方式:

1、<Allow />允许的意思,<deny>拒绝的意思

2、(*)  代表所有用户,(?) 代表匿名用户 (未授权)

3、使用 users 属性时,多个值逗号分隔开。使用 roles 属性时,多个值用逗号分隔开。

4、如果某个资源只允许某类用户访问,那么最后的一条规则一定是  <deny users="*"/><deny>一定写在后面

 

必须经过授权以后才能访问 ,匿名用户不能访问 

<location path="test.aspx">
    <system.web>
      <authorization> 
        <deny users="?"/> 
      </authorization>
    </system.web>
 </location>

 只能在admin,test这两个用户中,登录的用户才能访问

<location path="test.aspx">
    <system.web>
      <authorization>
        <allow users="admin,test"/>
        <deny users="?"/> 
      </authorization>
    </system.web>
 </location>

在拥有admin角色中登录的用户才能访问,其余用户都不能访问

<location path="test.aspx">
    <system.web>
      <authorization>
        <allow roles="admin"/>
        <deny users="*"/> 
      </authorization>
    </system.web>
</location>

角色验证后台设置: 

       /// <summary>
        /// 简单的Forms登录
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Login(Entity.T_UserModel model)
        {
            if (ModelState.IsValid)
            {
                //创建票据
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket            
                    (   1,                              //version: 票证的版本号
                        model.Account,                  //name :与票证关联的用户名。
                        DateTime.Now,                   //
                        DateTime.Now.AddMinutes(20),    //本地日期和票证的到期的时间
                        true,                           //是否生成持久性cookie
                        "admin,test",                   //要存储在票证的特定于用户的数据。理解为角色
                        "/"                             //cookie路径
                    );
                //加密票据,创建cookie
                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
                cookie.HttpOnly = true;
                HttpContext.Response.Cookies.Add(cookie);

                return RedirectToAction("Index", "Home", new { });
            }
            return View("Index");
   }


    /// <summary>
    /// 自定义 IHttpModule
    /// </summary>
    public class AuthenticateHttpModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.AuthenticateRequest += new EventHandler(AuthenticateRequest);
        }
        private void AuthenticateRequest(object sender, EventArgs e)
        {

            HttpApplication app = (HttpApplication)sender;
            HttpContext ctx = app.Context; //获取本次Http请求的HttpContext对象  
            if (ctx.User != null)
            {
                if (ctx.Request.IsAuthenticated == true) //验证过的一般用户才能进行角色验证  
                { 
                    FormsIdentity fi = (System.Web.Security.FormsIdentity)ctx.User.Identity;
                    FormsAuthenticationTicket ticket = fi.Ticket;   //取得身份验证票  
                    string userData = ticket.UserData;              //从UserData中恢复role信息
                    string[] roles = userData.Split(',');           //将角色数据转成字符串数组,得到相关的角色信息  
                    ctx.User = new GenericPrincipal(fi, roles);     //这样当前用户就拥有角色信息了
                }
            }
        }
 }
Action加角色和用户验证
        /// <summary>
        /// Action加角色和用户验证
        /// </summary>
        /// <returns></returns>
        [Authorize(Roles =("admin,test"),Users ="wwj")]
        public ActionResult Index()
        { 
            return View();
        }  

注册 自定义 IHttpModule 

<!--添加自定义 AuthenticateHttpModule type="命名空间.类名" -->
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules> 
      <add name="AuthenticateHttpModule" type="Web.App_Code.AuthenticateHttpModule"/>
    </modules> 
</system.webServer>

 点击下载Demo

3、Passport 验证

的萨达速度

posted on 2018-01-05 22:47  夜、微凉  阅读(1597)  评论(0编辑  收藏  举报