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

[ 2006-08-10 19:39:22 | 作者: yuhen ]
字号: | |
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()));
}
[最后修改由 yuhen, 于 2007-08-14 13:27:21]
评论Feed 评论Feed: http://www.rainsts.net/feed.asp?q=comment&id=280

浏览模式: 显示全部 | 评论: 1 | 引用: 0 | 排序 | 浏览: 5961
引用 yuhen
[ 2006-08-10 19:49:50 ]
还可以在 http://www.aspnetresources.com/tools/keycreator.aspx 在线创建 MachineKey。

发表评论
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
用户名:   密码:  
验证码 * 请输入验证码