Asp.net2.0中单域名多服务器的单点登陆(Single Sign-On)
问题描述:
有一主域名www.wow52.cn,跟AAA.wow52.cn,BBB.wow52.cn...等一系列子域名,各对应一个子系统,各系统多采用Asp.net 2.0技术实现,并且分布在不同的服务器上面,现在要求在这些系统中实现单点登陆.
方法如下
在个站点(子系统)的Web.config文件中增加以下2个节点
<system.web>
<machineKey validationKey="155027D0BE19AF1034CD97AF23C26D90B0F34AFAD33B34D292086A2EF974543C5D940D8B97F569E4EF3B288A2DD368383F75478BAE33C67C242C027A13C1EB5B"
decryptionKey="5F1C24D664A14AB7862FCE8F6A98E9E274DC1E21E6BFB060"
validation="SHA1"/>
<authentication mode="Forms">
<forms domain=".wow52.cn"
defaultUrl="index.html"
name=".xxx.comUSERNAMECOOKIE"
protection="All"
loginUrl="/UserLogin.aspx" />
</authentication>
</system.web>
用于生成节点<machinekey>的代码如下
using System;
using System.Text;
using System.Security.Cryptography;
namespace Crypto
{
public class KeyCreator
{
public static void Main(String[] args)
{
String[] commandLineArgs = System.Environment.GetCommandLineArgs();
string decryptionKey = CreateKey(System.Convert.ToInt32(commandLineArgs[1]));
string validationKey = CreateKey(System.Convert.ToInt32(commandLineArgs[2]));
Console.WriteLine("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>", validationKey, decryptionKey);
}
static String CreateKey(int numBytes)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[numBytes];
rng.GetBytes(buff);
return BytesToHexString(buff);
}
static String BytesToHexString(byte[] bytes)
{
StringBuilder hexString = new StringBuilder(64);
for (int counter = 0; counter < bytes.Length; counter++)
{
hexString.Append(String.Format("{0:X2}", bytes[counter]));
}
return hexString.ToString();
}
}
}
将以上代码编译后得到 hashconfigcs.exe 文件
在命令行输入 hashconfigcs.exe 24 64 key.txt
则 key.txt文件的内容即为<machineKey >节点
说明:
Asp.net 中的Forms表单身份验证是基于Cookie的,不过对Cookie数据按一定算法进行了加密与签名,默认情况下是用Machine.config 文件中的<machinekey>节点配置的信息(密匙,跟算法)来完成的,而在Machine.config 中的<machinekey>采用AutoGenerate 选项 因此不同服务器上的密匙基本不同,所以要手动来指定.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述