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

转载 2008年10月01日 11:21:00
MSDN 文档

ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/99e2f9e8-5b97-4a4d-a4ed-5f93276053b7.htm

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()));
}

asp.net mvc forms身份认证

web.config配置 增加一个Attribute类,继承自AuthorizeAttributepublic class CustomAu
  • letmefish
  • letmefish
  • 2016年08月10日 16:44
  • 1930

ASP.NET Forms验证详解

创建网站中,常常会使用到身份验证。asp.net中内置了几种身份验证的方式,如Windows、Froms、Passport等。这几种身份验证的方式各有不同。一般来说,网站的身份验证方式都会经过以下几个...
  • moonpure
  • moonpure
  • 2015年04月25日 15:23
  • 2053

跨应用程序进行 Forms 身份验证(.NET 1.1)

正在做一个程序,要整合到另一个系统中,身份控制方面有一些问题,在MSDN中找到了这个链接(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/...
  • gcs925
  • gcs925
  • 2005年10月12日 08:42
  • 1926

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

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说...
  • chen_xizhang
  • chen_xizhang
  • 2009年06月12日 00:51
  • 296

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

在开发过程中,我们需要做的事情包括:1. 在 web.config 中设置 Forms 身份验证相关参数。2. 创建登录页。登录页中的操作包括:1. 验证用户名和密码是否正确。2. 创建身份验证票证对...
  • sunchaohuang
  • sunchaohuang
  • 2007年07月04日 23:26
  • 1171

Form身份验证基本原理

先说说Form身份验证思路:假设用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户...
  • lulu_jiang
  • lulu_jiang
  • 2010年06月10日 17:12
  • 6197

ASP.NET Forms 身份验证

ASP.NET Forms 身份验证 ASP.NET Forms 身份验证 概述 ...
  • apinghappy
  • apinghappy
  • 2007年07月18日 10:30
  • 1127

java web之基于表单的身份验证

1.web应用程序安全主要注意什么 ①阻止未授权的用户访问敏感的数据 指定哪些用户才能访问哪些指定资源、用户的身份验证。身份验证简单方式采用post方式提交表单,用户名和密码。身份验证复杂方式采用X....
  • ya_1249463314
  • ya_1249463314
  • 2017年07月07日 17:14
  • 392

Forms身份验证基本原理

要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设置:              标签中的name表示指定要用于身份验证的HTTP Cookie(即指定Cooki...
  • guanglovemiao
  • guanglovemiao
  • 2014年02月21日 11:40
  • 2357

基于 Token 的身份验证和安全问题

1 前言最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展...
  • qq_35246620
  • qq_35246620
  • 2017年02月13日 16:15
  • 3357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[.NET 基于角色安全性验证] 之五:跨应用程序进行 Forms 身份验证
举报原因:
原因补充:

(最多只允许输入30个字)