ASP.NET 身份认证

时间:2022-01-17 09:23:47

ASP.NET 身份认证相关

原理

ASP.NET中身份认证分为两个阶段:认证与授权

1. 认证:识别当前请求的用户是不是一个可识别(登录)用户。AuthenticateRequest

2. 授权:是否允许当前请求访问指定资源。AuthorizeRequest

受保护页面和登录页面都可以在Web.Config进行配置。

Form认证是FormAuthenticationModule实现,Url授权是UrlAuthorizationModule实现。

1. 登陆:FormsAuthentication.SetAuthCookie() 方法

2. 注销:FormsAuthentication.SignOut() 方法

配置

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

限制单页面登陆

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

限制目录

<system.web>
<compilation debug="true" targetFramework="4.6.1"/>
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" timeout=""></forms>
</authentication>
<authorization>
<deny users="?" />
<allow users="?" />
</authorization>
</system.web>

限制所有

其中,deny 是拒绝,allow 是允许。

<location path="WebForm1.aspx">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>

允许某个页面登陆

如果某个资源允许某类用户访问。可以制定user role  ?=>代表匿名用户  *=>代表所有用户

Form身份验证

在web.config中,配置如下,会自动生成一个Cookie来保存用户状态。

<authentication mode="Forms">
  <forms loginUrl="~/Login.aspx" name="CookiesTest" timeout="300" cookieless="UseCookies"></forms>
</authentication>

ASP.NET 采用FormsAuthenticationTicket 对象,来表示一个Forms登录用户

加密和解密使用FormsAuthentication的 Encrypt 和 Decrypt来实现。

过程如下

1. 检查用户名密码

2. 根据登录名创建FormsAuthenticationTicket对象

3. 调用FormsAuthentication.Encrypt功能

4. UrlAuthorizationModule 执行授权检查

三者关系为:

FormsAuthenticationTicket:数据结构

FormsAuthentication:处理这个数据结构的工具类

UrlAuthorizationModule:授权检查模块

单点身份验证

需要在多台机器之间使用Form身份验证时,不能再使用随机生成密钥的方式,需要手工指定

WebConfig中添加machineKey配置,可以指定加密和解密算法。

不同项目的machineKey节点确保以下字段完全一样,validationKey, decryptionKey, validation, name

Cookie名称必须一样,区分大小写,登陆界面整合到统一登陆点 loginUrl

<machineKey validationKey="5029E82E1779497186D46F83D78FAD0786D46F83D78FAD" decryptionKey="82B8397DB5B4443FB035083EB662CD98" validation="SHA1" decryption="Auto" />

validationKey 向视图状态值和身份验证Cookie添加杂乱信息(40-128位)。decryptionKey 加密试图状态和验证Cookie(16-48位)

AutoGenerate 代表生成随机值,保存在本地,单服务器适用。使用16进制