你的位置:首页 > ASP.net教程

[ASP.net教程]authentication与网站安全验证


1.Forms 身份验证提供程序

   

通过 Forms 身份验证,可以使用所创建的登录窗体验证用户的用户名和密码。未经过身份验证的请求被重定向到登录页,用户在该页上提供凭据和提交窗体。如果应用程序对请求进行了验证,系统会颁发一个票证,该票证包含用于重建后续请求的标识的密钥。

   

ASP.NET Forms 身份验证概述

Forms 身份验证使您可以使用自己的代码对用户进行身份验证,然后将身份验证标记保留在 Cookie 或页的 URL 中。Forms 身份验证通过FormsAuthenticationModule 类参与到 ASP.NET 页的生命周期中。可以通过 FormsAuthentication 类访问 Forms 身份验证信息和功能。

若要使用 Forms 身份验证,可以创建一个登录页。该登录页既可收集用户的凭据,又包含用于对这些凭据进行身份验证的代码。通常,可以对应用程序进行配置,以便在用户尝试访问受保护的资源(如要求身份验证的页)时,将请求重定向到登录页。如果用户的凭据有效,则可以调用FormsAuthentication 类的方法,以使用适当的身份验证票证 (Cookie) 将请求重定向回到最初请求的资源。如果不需要进行重定向,则只需获取 Forms 身份验证 Cookie 或对其进行设置即可。在后续的请求中,用户的浏览器会随同请求一起传递相应的身份验证 Cookie,从而绕开登录页。

通过使用 authentication 配置元素,可以对 Forms 身份验证进行配置。最简单的情况是使用登录页。在配置文件中,指定一个 URL 以将未经身份验证的请求重定向到登录页。然后在 Web.config 文件或单独的文件中定义有效的凭据。下面的示例演示配置文件的一部分,其中为 Authenticate 方法指定了登录页和身份验证凭据。密码已经使用 HashPasswordForStoringInConfigFile 方法进行加密。

<authentication mode="Forms"><forms name="SavingsPlan" loginUrl="/Login.aspx"><credentials passwordFormat="SHA1"><user name="Kim"password="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6"/><user name="John"password="BA56E5E0366D003E98EA1C7F04ABF8FCB3753889"/></credentials></forms></authentication>

在身份验证成功之后,FormsAuthenticationModule 模块会将 User 属性的值设置为对经过身份验证的用户的引用。下面的代码示例演示如何以编程方式读取经过 Forms 身份验证的用户的标识。

以上配置可以通过 FormsAuthentication.Authenticate(model.UserName, model.Password) 来验证是否通过认证

String authUser2 = User.Identity.Name;  

Forms 身份验证和身份验证服务

   

通过使用 ASP.NET 身份验证服务,还可以作为 Windows Communication Framework (WCF) 服务来访问 Forms 身份验证。身份验证服务使您能够从可以发送和使用 SOAP 格式的消息的任何应用程序使用 Forms 身份验证。身份验证服务接受用户凭据并返回 Forms 身份验证 Cookie。

   

https://msdn.microsoft.com/zh-cn/library/9wff0kyh(v=vs.100).aspx

   

Form身份验证控制流

浏览器和 HTTP 操作

服务器答复

从服务器请求受保护的资源。HTTP 操作为:

GET /default.aspx

如果不存在身份验证 Cookie,则将请求重定向到登录页以收集凭据。使用 RETURNURL 作为关键字,将有关起始页的信息放在查询字符串中。服务器 HTTP 答复为:

302 Found
Location: http://samples.microsoft.com/logon.aspx?RETURNURL=/default.aspx

重定向到登录页。HTTP 操作为:

GET /logon.aspx?RETURNURL=/default.aspx

返回登录页。为安全起见,建议对登录页使用安全套接字层 (SSL),以阻止用户凭据以明文形式发送。服务器 HTTP 答复为:

200 OK

用户在登录页输入凭据后,提交该页。HTTP 操作为:

POST /logon.aspx?RETURNURL=/default.aspx

验证用户凭据,如果凭据通过身份验证,则将浏览器重定向到在 QueryString 中作为 RETURNURL 变量指定的原始 URL。默认情况下,身份验证票证以 Cookie 的形式发出。

说明:

您可以使用 CookieMode 属性,指定将身份验证票证包含在 URL 中,而不是包含在 Cookie 中。

服务器 HTTP 答复为:

302 Found
Location: /default.aspx

遵循重定向操作并再次请求原始资源。HTTP 操作为:

GET /default.aspx

如果用户通过身份验证,则允许访问并授予身份验证 Cookie,该 Cookie 中包含身份验证票证。同一浏览器会话的以后的请求将在模块检查该 Cookie 时进行身份验证。可以创建可用于以后的会话的持久性 Cookie,但该 Cookie 的使用期截止到到期日期为止。服务器 HTTP 答复为:

200 OK
Set-Cookie: ASPXTICKET=ABCDEFG12345;Path=/

注意,Cookie 路径设置为 /。由于 Cookie 名称区分大小写,因此这有助于防止站点中的 URL 的大小写不一致。例如,如果路径设置为 /SavingsPlan,而链接包含 /savingsplan,由于浏览器不会发送 Cookie,用户将被迫重新进行身份验证。


  

若通过了认证,需要调用 FormsAuthentication.SetAuthCookie,才会创建票证,响应中才会带set-cookie命令;而在注销时需要调用FormsAuthentication.SignOut来清除票证,响应中会添加set-cookie=;命令来清除浏览器端的票证。

  

跨应用程序进行 Forms 身份验证

若要配置跨应用程序的 Forms 身份验证,对于参与共享的 Forms 身份验证的所有应用程序,应将 Web.config 文件的 forms 和 machineKey 节的属性设置为相同的值。name、protection、path、validationKey、validation、decryptionKey 和 decryption 属性必须在所有应用程序中都完全相同。同样,用于身份验证票证(Cookie 数据)的加密密钥值和验证密钥值以及加密方案和验证方案必须相同。如果设置不匹配,则不能共享身份验证票证。如下面可直接尝试

<forms defaultUrl="/Home/Index" loginUrl="/Home/LogOn" timeout="60" name=".ASPXFORMSAUTH" protection="All" path="/" ></forms><machineKeyvalidationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8"decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77"decryption="3DES"validation="SHA1"/>

但经我尝试,确实两个系统一方登录,另一方则在请求时附带相同票证,但是个人估计这是停留在ASP.NET层次的,过了这个认证,到不同系统因为认证逻辑如果有出入仍会导致最终认证结果不同。但注销时则不一样,一方注销,票证清空,所有系统的Form认证都不通过。

来自 <https://msdn.microsoft.com/zh-cn/library/eb0zx8fc(v=vs.100).aspx>

   

2.Windows 身份验证提供程序

Web.config中设置

<authentication mode="Windows"/>

在IIS中才可实现,IIS安装时"基本身份验证"需要勾上,

   

IIS的安全性才会有"基本身份验证",

将其启用,访问网站时则会弹出windows的登录窗口,此时输入的用户名密码则是服务器中的windows用户名及其密码则可登录。

查看过它的网络请求,并未发现类型form请求中的服务器交互信息及相关cookie。

   

来自 <https://msdn.microsoft.com/zh-cn/library/907hb5w9(v=vs.100).aspx>