ASP.NET核心中的窗体身份验证解密

c3frrgcw  于 2022-12-30  发布在  .NET
关注(0)|答案(2)|浏览(147)

我们有多个具有单点登录的ASP.NET MVC应用程序,其中我们使用FormsAuthentication.Encrypt()方法传递加密字符串,并将其作为查询字符串传递,然后使用FormsAuthentication.Decrypt()解密相同的字符串。
由于这两个站点都是在Asp.NetMVC中开发的,因此我们能够使用窗体身份验证并能够解密字符串。
现在我们正在开发一个新的项目在ASP.NET核心,我们传递一个加密字符串作为查询字符串从ASP.NET MVC和解密在ASP.NET核心的Web应用程序。
在Asp.NetCore中是否有其他方法可以解密字符串
注意:我们不使用ASP.NET标识

//Encryption
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "Name", DateTime.Now, DateTime.Now.AddMinutes(60), true, "DataToEncrypt");

string encrypted = FormsAuthentication.Encrypt(ticket);
Response.Redirect("siteUrl?CookieName="+encrypted );

//Decryption
HttpCookie authCookie = Request.Cookies["CookieName"];

var formsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value);
string _userData = formsAuthenticationTicket.UserData;
f0brbegy

f0brbegy1#

不,您之前所做的依赖于两个应用程序共享相同的机器密钥,以便它们都以相同的方式加密/解密。ASP.NET核心不支持机器密钥的概念,也不使用它们进行加密。相反,它使用数据保护提供程序。因此,无法解密ASP.NET核心中基于计算机密钥在ASP.NET应用程序中加密的值。句号。
也就是说,ASP.NET Core * 中使用的数据保护提供程序概念可以 * 用于ASP.NET,但这显然需要您更改当前的设计,以利用数据保护提供程序来加密/解密,而不是当前的方法。然后,假设所有应用程序中的提供程序配置相同,那么你就可以在ASP.NET核心中解密。也就是说,这要求数据保护提供程序使用的密钥环位于所有应用程序都可以访问的共享位置,并且所有应用程序都配置为使用相同的应用程序名称。
请参考documentation来了解如何设置这个。文档是面向cookie共享和auth的,但这是关于它共享加密方案的,所以设置文档中提到的数据保护位就足够了。

ccrfmcuu

ccrfmcuu2#

是的,这可以在不更改旧版应用程序中的任何内容的情况下完成:https://github.com/julian-maughan/FormsAuthDecryptor
不过我还在寻找如何加密机票回来续签滑动到期。

// get auth cookie value set by web forms authentication
var authCookieValue = context.Request.Cookies[_authCookieName];

// use special library to decript cookie value since .Net core has no built in means to do this
// note that _encryptionKey, _validationKey, and ValidationAlgorithm type must match with that from legacy web.config
var decryptor = new Decryptor(_encryptionKey, _validationKey, ValidationAlgorithm.HmacSha256);
var ticket = decryptor.Decrypt(authCookieValue);

// now that ticket is in the clear we can create a .Net core identity from it
var identity = new ClaimsIdentity(new[] {
  new Claim(ClaimTypes.Name, ticket.Name),
  new Claim(ClaimTypes.Role, "YourRole")
}, "CustomAuthenticationType");
context.User = new ClaimsPrincipal(identity);

相关问题