【问题标题】:How to configure machineKey in Custom Membership to use MD5 for ASP.MVC 4 (net 4.5)?如何在自定义成员中配置 machineKey 以将 MD5 用于 ASP.MVC 4(net 4.5)?
【发布时间】:2013-08-29 17:59:27
【问题描述】:

我正在实现一个 CustomMembership Provider,第一部分工作,登录,注册等(我现在从 http://msdn.microsoft.com/en-us/library/vstudio/w8h3skw9(v=vs.100).aspx 中选择了 validationKey 和 decriptionKey)。

我的 Web.Config:

<system.web>
    <machineKey validationKey="32E35872597989D14CC1D5D9F5B1E94238D0EE32CF10AA2D2059533DF6035F4F" decryptionKey="B179091DBB2389B996A526DE8BCD7ACFDBCAB04EF1D085481C61496F693DF5F4"/>
    <membership defaultProvider="CustomMembershipProvider">
      <providers>
        <clear />
        <add name="CustomMembershipProvider" type="CustomMembership.CustomMembership.CustomMembershipProvider" connectionStringName="TestMembershipEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" passwordFormat="Encrypted" />
      </providers>
    </membership>
    <roleManager enabled="true" defaultProvider="CustomRoleProvider">
      <providers>
        ...

现在我需要使用 MD5。

方法EncryptPassword如果我在MachineKey中设置validation属性选择正确的算法?

switch (PasswordFormat)
{
    case MembershipPasswordFormat.Clear:
        break;
    case MembershipPasswordFormat.Encrypted:
        byte[] encryptedPass = EncryptPassword(Encoding.Unicode.GetBytes(password));
        encodedPassword = Convert.ToBase64String(encryptedPass);
        break;
    case MembershipPasswordFormat.Hashed:
        HMACSHA1 hash = new HMACSHA1();
        hash.Key = HexToByte(machineKey.ValidationKey);
        encodedPassword =     Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));
        break;
    default:
        throw new ProviderException("Unsupported password format.");
}

更改机器密钥

<machineKey validationKey="32E35872597989D14CC1D5D9F5B1E94238D0EE32CF10AA2D2059533DF6035F4F" decryptionKey="B179091DBB2389B996A526DE8BCD7ACFDBCAB04EF1D085481C61496F693DF5F4" 
validation="MD5"  decryption="Auto" />

如果这样做,我会在@Html.AntiForgeryToken() 中收到以下错误:

**ConfigurationErrorsException was unhandled...**
When using <machineKey compatibilityMode="Framework45" /> or the MachineKey.Protect and MachineKey.Unprotect APIs,
the 'validation' attribute must be one of these values: SHA1, HMACSHA256, HMACSHA384, HMACSHA512, or alg:[KeyedHashAlgorithm].

我需要在case MembershipPasswordFormat.Encrypted: 中编写自定义代码来加密/解密 MD5 或我需要做的事情,谢谢。

【问题讨论】:

    标签: asp.net-mvc-4 encryption asp.net-membership md5


    【解决方案1】:

    这个博客解释得更好:

    选择加入或退出 4.5 代码路径

    正如您可能想象的那样,对加密管道进行如此剧烈的更改是以牺牲兼容性为代价的。而且由于 .NET 4.5 是对 .NET 4 的就地更新,我们无法默认启用这些新行为,否则我们将面临破坏现有应用程序的不可接受的风险。

    要选择加入新的 ASP.NET 4.5 行为,只需在 Web.config 中设置以下内容:

    <machineKey compatibilityMode="Framework45" />
    

    或者,您可以设置以下开关,这是 ASP.NET 4.5 项目模板所做的:

    上述开关负责一系列运行时行为更改,但这是另一天的博客文章。这里重要的一点是,在元素中将目标框架设置为 4.5 会自动暗示兼容模式的默认设置为 Framework45,除非已明确指定机器密钥兼容模式。

    ASP.NET 历来支持在不同版本的框架之间共享表单身份验证票证。例如,这允许由运行 ASP.NET 2.0 的应用程序生成票证并由运行 ASP.NET 4 的应用程序验证。如果您正在编写面向 ASP.NET 4.5 的应用程序(您已设置),并且您需要与运行 ASP.NET 早期版本的应用程序共享票证,则必须在 4.5 项目的 Web.config 中设置以下内容:

    值 Framework20SP1 是所有 ASP.NET 版本的默认机器密钥兼容模式。即使计算机上安装了 .NET 4.5,这也会产生使用旧加密代码路径的效果。碰巧在安装了 4.5 的计算机上运行的现有 ASP.NET 4 应用程序不会自动获得新行为,因为该应用程序的 Web.config 中既不会也不会出现新行为。但是,如果您创建了一个针对 4.5 的新应用程序(因此它具有这些配置设置)并且需要保持与现有应用程序的表单身份验证票证兼容性,您可以将 Framework20SP1 设置为与早期版本的 ASP.NET 互操作

    http://blogs.msdn.com/b/webdev/archive/2012/10/23/cryptographic-improvements-in-asp-net-4-5-pt-2.aspx

    【讨论】:

      【解决方案2】:

      试试:

       <machineKey compatibilityMode="Framework20SP2".... 
      

      注意:这是compatibilityMode中的小写“c”。

      compatibilityMode 属性的可能值为: 框架20SP1, 框架20SP2, 框架45

      见: http://msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode(v=vs.110).aspx

      【讨论】:

        【解决方案3】:

        更新您的机器密钥标签以添加以下内容 (MSDN):

        <machineKey compatibilityMode="Framework20SP1".... />
        

        注意:compatibilityMode中的小写“c”

        但是说真的,MD5 是一种非常弱的算法,如果可能的话,不要使用它,而是使用更安全的加密方案。这是它在较新的 .NET 框架中作为有效加密算法被删除的原因之一。

        【讨论】:

        • 很可能是因为错误声明的第二部分 - MachineKey.Protect 和 MachineKey.Unprotect API - antiForgeryToken 必须使用这些。但是,我找不到明确的答案。
        猜你喜欢
        • 1970-01-01
        • 2015-02-05
        • 2019-10-30
        • 2012-08-27
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        相关资源
        最近更新 更多