zoukankan      html  css  js  c++  java
  • ASP.NET中使用Forms验证身份验证

    简介

    ASP.NET中身份验证有三种方式,分别是Windows、Forms和Passport,Windows验证基于窗体验证,需要每个页面写上验证身份代码,相对灵活,但操作过于复杂;Passport使用由微软提供的集中身份验证方式,安全性较高,但实现较复杂。最适合中小型项目的就是基于Forms的身份验证,它将所定义的文件和目录集中到一个页面去做验证,将用户的身份发回写到客户端的Cookie,在Cookie未过期的时间段内用户再次访问网站,就会连同身份Cookie发送到服务器端,服务端的授权设置可以根据不同目录不同用户进行控制了。它的权限模型为用户——角色模型,能满足绝大多数应用场景。

    实现

    应用场景中所有用户都拥有全部权限,此时就只有一个角色,或者认为没有角色,这样只需要验证cookie是否存在即可。以下将一步一步实现该应用。

    首先建立网站项目,修改Web.config:

    <configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
    <compilation debug="true">
    </compilation>
    <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/login.aspx" protection="All"></forms>
    </authentication>
    <authorization>
    <deny users="?"/>
    </authorization>
    </system.web>
    </configuration>

    这里注意authetication段为配置身份验证方式,loginUrl为默认验证页,直接访问其它页会返回到此页进行身份验证。name属性值为cookie名称。另外它还拥有以下属性:

    cookieless:定义是否使用Cookie及Cookie的行为。UserCookies指定无论在任何设备上都使用Cookie;UseUri指定从不使用Cookie;AutoDetect指自适应设备使用;UseDeviceProfile指定适应浏览器支持Cookie。

    defaultUrl:定义在身份验证后重定向的默认URL。

    timeout:指定Cookie过期时间。

    domain:指定Cookie所在域,要知道Cookie是不能跨域的。

    Protection:设置为 All,以指定窗体身份验证票的保密性和完整性。这导致使用 machineKey 元素上指定的算法对身份验证票证进行加密,并且使用同样是 machineKey 元素上指定的哈希算法进行签名。

    使用authorizaion元素配置用户授权模型,

    使用allow元素存储允许访问的用户和角色,使用deny元素存储拒绝访问的用户和角色。分别使用users、roles和verbs来控制用户、角色及HTTP传输方法。如:

    <authorization>
    <allow users="user1,user2,user3" roles="admin,submitter" verbs="GET,HEAD,POST,DEBUG"/>
    <deny users="user4" roles="guest" verbs=""/>
    </authorization>

    表示授权user1,user2,user3访问,不允许user4访问,访问角色权限为admin和submitter,允许行为为GET四种。我们这里使用user="?"代表所有用户。

    建立login.aspx,页面布局如下:

    验证身份及写入Cookie代码如下:

    //存储角色权限
    string[] userRoles=new string[]{"1","1","0"};//isAdmin,isEditor,isPublisher
    string userData = userName + "," + string.Join(",", userRoles);
    //创建票据
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(30), true,userData);
    //加密票据
    string authTicket = FormsAuthentication.Encrypt(ticket);
    //存储为cookie
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket);
    //cookie.Domain = "51obj.cn";
    cookie.Expires = ticket.Expiration;
    Response.Cookies.Add(cookie);
    Response.Redirect("index.aspx");

    这样Cookie就写入了客户端,用户访问其他页面,如果检测到Cookie不存在就会跳转到login.aspx这个页面进行验证。

    可读取用户名和角色信息:

    HttpCookie cookie = Request.Cookies[".ASPXAUTH"];
    string[] userData = ((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData.Split(',');
    string userName = userData[0];
    bool isAdmin = Convert.ToBoolean(Convert.ToInt32(userData[1]));
    bool isEditor = Convert.ToBoolean(Convert.ToInt32(userData[2]));
    bool isPubliher = Convert.ToBoolean(Convert.ToInt32(userData[3]));

    代码下载

  • 相关阅读:
    [读书笔记]黑客与画家[Hackers.and.Painters]
    android电池充电以及电量检测驱动分析
    LV在系统重启后不能自动激活(boot.lvm&after.loca)
    线段树菜鸟一题+归并排序【求逆序数】POJ2299
    【PAT】1035. Password (20)
    Android应用开发学习笔记之ContentProvider
    UVAlive 2322 Wooden Sticks(贪心)
    卸载QTP
    线段树模板
    2013 CSU校队选拔赛(1) 部分题解
  • 原文地址:https://www.cnblogs.com/walkingp/p/1977719.html
Copyright © 2011-2022 走看看