[.NET 基于角色安全性验证] 之五:跨应用程序进行 Forms 身份验证

ASP.NET 支持在分布式环境中(跨单个服务器上的多个应用程序或在网络场中)进行 Forms 身份验证。如果启用了跨多个 ASP.NET 应用程序的 Forms 身份验证,则当用户在应用程序之间切换时,不需要对他们重新进行身份验证。

要配置跨应用程序的 Forms 身份验证,请在 forms 和 machineKey 配置节中设置若干属性,以便值对于参与共享 Forms 身份验证的所有应用程序都是相同的。

下面的示例演示了 Web.config 文件的 Authentication 节。除非另行说明,否则 name、protection、path、validationKey 和 decryptionKey 属性必须在所有应用程序中都完全相同。同样,用于 Cookie 数据的加密和验证密钥以及加密方案也必须完全相同。如果设置不匹配,则不能共享 Cookie。

web.config

<configuration>
  <system.web>
    <authentication mode="Forms" >
      <!-- The name, protection, and path attributes must match
      exactly in each Web.config file. -->
      <forms loginUrl="login.aspx"
        name=".ASPXFORMSAUTH"
        protection="All"
        path="/"
        timeout="30" />
    </authentication>

    <!-- Validation and decryption keys must exactly match and cannot
    be set to "AutoGenerate". The validation algorithm must also
    be the same. -->
    <machineKey
      validationKey="C50B3C89CB21F4...BE"
      decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"
      validation="SHA1" />
  </system.web>
</configuration>

发出 Cookie 之后,将根据 Cookie 自身中的 Expires 值跟踪 Cookie 的到期时间。这意味着如果两个应用程序具有不同的 Timeout 属性,则将在 Cookie 的整个生存期中保留最初发出每个 Cookie 时设置的到期日期和时间。当更新 Cookie 时,Cookie 的原始到期时间用于计算新到期时间。使用配置 Timeout 值的唯一时间就是最初创建 Cookie 的时间。

-----------------------------------------------------

补充

按照上述操作,我们就可以在单个或多个服务器的网络场中实现 "跨应用程序进行 Forms 身份验证",这个有点 "单点登录(SSO, Single Sign On)" 的意思,不过有几点还是要注意一下。

1. 如果使用新打开的浏览器窗体打开另外的应用程序网站,则必须创建持久 Cookie (跨浏览器会话保存 Cookie) 时,才能在多个应用程序中共享登录信息。
("新打开的浏览器窗体" 这话有点拗口,也就说这个窗体不是原浏览器弹出的,而是我们使用快捷方式新打开的进程。)

FormsAuthentication.RedirectFromLoginPage("username", true);

2. MachineKey 创建方法。

using System.Text;
using System.Security.Cryptography;

public class MachineKey
{
  const int validationKeyLength = 64;
  const int decryptionKeyLength = 24;
  private RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

  public string GenerateKey()
  {
    return string.Format("<machineKey validationKey=/"{0}/"/r/ndecryptionKey=/"{1}/"/r/nvalidation=/"SHA1/"/>",
      BytesToHex(GenerateKeyBytes(validationKeyLength)), BytesToHex(GenerateKeyBytes(decryptionKeyLength)));
  }

  private byte[] GenerateKeyBytes(int cb)
  {
    byte[] rndData = new byte[cb];
    rng.GetBytes(rndData);
    return rndData;
  }

  private string BytesToHex(byte[] key)
  {
    StringBuilder sb = new StringBuilder();
    
    for (int i = 0; i < key.Length; ++i)
    {
      sb.Append(String.Format("{0:X2}", key[i]));
    }

    return sb.ToString();
  }
}

使用方法

protected void Page_Load(object sender, EventArgs e)
{
  Response.Write(HttpUtility.HtmlEncode(new MachineKey().GenerateKey()));
}
 

时间: 2024-11-02 20:31:45

[.NET 基于角色安全性验证] 之五:跨应用程序进行 Forms 身份验证的相关文章

ASP.NET中跨应用程序进行Forms身份验证详解

先仔细阅读这段内容:ASP.NET 支持在分布式环境中(跨单个服务器上的多个应用程序或在网络场中)进行 Forms 身份验证. 之前研究过多站点间的Session共享的问题,这里说下跨应用程序进行 Forms 身份验证详细实现方式,此方案的基础就是"跨应用程序进行 Forms 身份验证"(帮助可点击链接或是自己直接查找MSDN). 在VS2005中建立两个Web应用程度的项目,两个项目都添加一个Default.aspx页面,其中一个项目增加Login.aspx页面,实现"Fo

ASP.NET Internet安全Forms身份验证方法_实用技巧

本文分别以ASP.NET1.1与ASP.NET2.0在Forms 身份验证上的实现方法,以及ASP.NET2.0较上一版本有哪些改进或变化进行说明.相信读者都己经看过许多类似这样的文章,不伦是在网上或是某些专业书籍上,最近又有模式&实践小组成员发布WCF安全模型指南,可见构建网站安全总是不过时的话题,作者认为此文也绝对是您应该收藏的参考资料. ASP.NET 安全性的工作原理 网站在安全性方面有一个常见的要求:特定的页面仅允许某些成员或其他经过身份验证的用户浏览.充分利用Forms身份验证是最好

如何通过SQL Server2000使用Forms 身份验证

  摘要 ASP.NET Forms 身份验证允许用户将凭据(用户名和密码)输入到 Web Form 来标识其身份.在收到这些凭据时,Web 应用程序可以根据数据源来检查这些凭据,从而对用户进行身份验证. 本模块描述如何使用密码哈希安全地将用户凭据存储在 SQL Server 中,以及如何根据包含在 SQL Server 中的帐户数据库对用户进行身份验证. 预备知识 安全地存储用户凭据包含两个关键概念: • 存储密码摘要.出于安全性考虑,请不要将密码明文存储在数据库中.本模块描述如何创建和存储用

[.NET 基于角色安全性验证] 之一:基础知识

.NET 基于角色安全性验证的核心是主体(Principal)和标识(Identity)对象,其中主体负责角色或者组的验证,标识对象封装有关正在验证的用户或实体的信息.角色安全性验证通过生成可供当前线程使用的主体信息来支持授权,其中主体用关联的标识进行构造. public interface IPrincipal{ // Methods bool IsInRole(string role);  // Properties IIdentity Identity { get; }} public i

[.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证

在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用户名和密码是否正确.2. 创建身份验证票证对象.3. 将身份验证票证对象加密成字符串,写入 Cookies.4. 重定向到原始请求 URL. 1. 简单演示 web.config <?xml version="1.0"?><configuration>  <system.web>    &l

asp.net Forms身份验证和基于角色的权限访问_实用技巧

主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面. 具体步骤:     1.创建一个网站,结构如下:         网站根目录             Admin目录            ---->    管理员目录                 Manager.aspx        ---->    管理员可以访问的页面             Users目录            ---->    注册用户目录         

跨服务器Forms身份验证,获取不到AuthCookie

问题描述 跨服务器Forms身份验证,获取不到AuthCookie<machineKeyvalidationKey="***"decryptionKey="***"decryption="3DES"validation="SHA1"/>两个站点都配置了一致的值,登录站点登录后,另一个却无法获得登录信息

浅谈asp.net Forms身份验证详解_实用技巧

在做网站的时候,都会用到用户登录的功能.对于一些敏感的资源,我们只希望被授权的用户才能够访问,这让然需要用户的身份验证.对于初学者,通常将用户登录信息存放在Session中,笔者在刚接触到asp.net的时候就是这么做的.当我将用户信息存在在Session中时,常常会遇到Session丢失导致用户无法正常访问被授权的资源,保持用户登录状态时的安全性问题,无休其实,在asp.net中,我们有更好的解决方案,那就是通过Forms身份验证,从而对用户进行授权,这种方法可以轻松的保持用户的登录状态(如果

.Net1.1下的Forms身份验证在系统升级到2003SP2后无法登录,哪位老大指点迷津

问题描述 俺的2003服务器打了SP2补丁后,每次登陆网站都会被重定向回登陆页面(打补丁之前一切正常),网站使用的是Forms身份验证,身份验证用的是微软的例子代码,已经稳定运行三年多了,我跟踪代码发现一切正常,只不过身份验证完成之后,跳转到其他页面时,立刻被强制跳回了登陆页面,俺做了几次实验,在2003和2003SP1下都正常,SP2下就肯定出这个问题,网站运行在.Net1.143版本下,哪位高手帮忙解决一下代码如下:FormsAuthentication.RedirectFromLoginP