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

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
None.gif < configuration >
None.gif  
< system .web >
None.gif    
< authentication  mode ="Forms"   >
None.gif      
<!--  The name, protection, and path attributes must match 
None.gif      exactly in each Web.config file. 
-->
None.gif      
< forms  loginUrl ="login.aspx"
None.gif        name
=".ASPXFORMSAUTH"  
None.gif        protection
="All"  
None.gif        path
="/"  
None.gif        timeout
="30"   />
None.gif    
</ authentication >
None.gif
None.gif    
<!--  Validation and decryption keys must exactly match and cannot
None.gif    be set to "AutoGenerate". The validation algorithm must also 
None.gif    be the same. 
-->
None.gif    
< machineKey
None.gif      
validationKey ="C50B3C89CB21F4dot.gifBE"  
None.gif      decryptionKey
="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"  
None.gif      validation
="SHA1"   />
None.gif  
</ system.web >
None.gif
</ configuration >
None.gif

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

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

雨痕补充

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

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

2. MachineKey 创建方法。
None.gif using  System.Text;
None.gif
using  System.Security.Cryptography;
None.gif
None.gif
public   class  MachineKey
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
const int validationKeyLength = 64;
InBlock.gif  
const int decryptionKeyLength = 24;
InBlock.gif  
private RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
InBlock.gif
InBlock.gif  
public string GenerateKey()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
return string.Format("<machineKey validationKey=\"dot.gif{0}\"\r\ndecryptionKey=\"dot.gif{1}\"\r\nvalidation=\"SHA1\"/>",
InBlock.gif      BytesToHex(GenerateKeyBytes(validationKeyLength)), BytesToHex(GenerateKeyBytes(decryptionKeyLength)));
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
private byte[] GenerateKeyBytes(int cb)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
byte[] rndData = new byte[cb];
InBlock.gif    rng.GetBytes(rndData);
InBlock.gif    
return rndData;
ExpandedSubBlockEnd.gif  }

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

InBlock.gif
InBlock.gif    
return sb.ToString();
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

使用方法
None.gif protected   void  Page_Load( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  Response.Write(HttpUtility.HtmlEncode(
new MachineKey().GenerateKey()));
ExpandedBlockEnd.gif}

还可以在 http://www.aspnetresources.com/tools/keycreator.aspx 在线创建 MachineKey。

转载于:https://www.cnblogs.com/lilixinshu/archive/2007/07/31/838239.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值