如何在ASP.NET Core 2.0中实现machineKey

27
在ASP.NET(非Core)中,我通常会在web.config中添加一个machineKey,以便我可以在本地机器上执行一些功能,而不是在服务器上执行,以便数据库/回调操作使用相同的密钥。例如
<system.web>
  <machineKey validationKey="*********" 
              decryptionKey="*********" 
              validation="HMACSHA256" 
              decryption="AES" />
</system.web>

请问有人能够指导如何在ASP.NET Core 2.0中完成这个任务吗?


1
重复的问题,这里有一个“更易懂”的答案:https://dev59.com/iVYN5IYBdhLWcg3wza94#46894509 - Nick Kovalsky
@pathdongle,你解决了这个问题吗?我找不到在数据保护 API 中设置共享 validationKey 和 decryptionKey 的示例。 - Yodacheese
你应该添加数据保护,阅读这个答案 - D.L.MAN
5个回答

17

现在您需要使用DataProtection API

  

ASP.NET Core数据保护堆栈提供了一个简单易用的加密API,开发人员可以用它来保护数据,包括密钥管理和轮换。

示例可在官方的DataProtection 存储库中找到。

顺便提一下,同样的方法也适用于ASP.NET:在ASP.NET中替换<machineKey>


数据保护系统基于两个核心概念——数据保护提供程序(由IDataProtectionProvider接口表示),用于通过CreateProtector方法创建数据保护器(由IDataProtector接口表示)。数据保护器用于加密和解密数据。

要将IDataProtectionProvider注册到DI中,请使用.AddDataProtection方法:

public void ConfigureServices(IServiceCollection services)
{
    // Adds data protection services
    services.AddDataProtection();
    ...
}

4
AddDataProtection是所需的全部吗?我不明白它怎么能起作用...你肯定得在某处设置密钥...可以加入一个完整的示例吗? - Seabizkit
如果您只需要在一个服务器上运行,可以尝试添加services.AddDataProtection().ProtectKeysWithDpapi(); - codeMonkey
只是要注意一下,如果您在不同的应用程序中使用相同的密钥(例如My.App.Web和My.App.Service),您需要设置一个单独的应用程序名称:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1#setapplicationname-1 - g4j

5
您可以在此链接中找到关于it技术方面的好例子:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-2.2&tabs=visual-studio
我使用我的数据库上下文来将密钥持久化到多个实例中。
DbContext.cs
public class MyContext : IDataProtectionKeyContext
{
  ...
  // This maps to the table that stores keys.
  public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddDataProtection().PersistKeysToDbContext<MyContext>();
}

1
我按照您的建议和文档进行了配置,但我想我需要创建密钥,相当于机器密钥。为了使asp.net Identity在两个不同的服务器上工作,我该如何做呢?谢谢。 - CidaoPapito
一个必要的附加步骤是为密钥设置ApplicationName,以便多个应用程序共享相同的密钥"相同的方式"。如果您因为在不同的应用程序(不同的程序集)中调用了GenerateEmailConfirmationTokenAsync而出现此错误,您需要设置应用程序名称:https://learn.microsoft.com/zh-cn/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1#setapplicationname-1 - g4j

3

如果您有遗留问题需要构建基于经典ASP.NET应用程序生成身份验证Cookie的ASP.NET Core应用程序,则有一个开源库可用,可让您将这些遗留Cookie集成到您的ASP.NET Core应用程序中。开发人员使用.NET Framework参考实现来构建自己基于Machinekey的加密/解密逻辑。请参见https://github.com/synercoder/FormsAuthentication


0

回复晚了,但对于任何愿意在ASP.net core中解密和加密FormsAuthentication票证令牌的人来说非常有用。这里有一个专门做这个的库:https://github.com/dazinator/AspNetCore.LegacyAuthCookieCompat

复制您的验证密钥和解密密钥,并将其作为参数传递给库的解密或加密函数。 请注意,如果解密或加密不起作用,请尝试使用加密算法和兼容性标志来匹配您的目的。例如:

        var encryptor = new LegacyFormsAuthenticationTicketEncryptor(SHA512DecryptionKey, SHA512ValidationKey, ShaVersion.Sha256, CompatibilityMode.Framework20SP2);

或者更改标志和兼容性为:

        var encryptor = new LegacyFormsAuthenticationTicketEncryptor(SHA512DecryptionKey, SHA512ValidationKey, ShaVersion.Sha512, CompatibilityMode.Framework45);

然后,按照下面所示的方式解密令牌:

        FormsAuthenticationTicket result = encryptor.DecryptCookie(encryptedText); 

-1

asp.net Core中,您应该设置数据保护系统。

欲了解更多信息,请阅读此答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接