1

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

我的网络配置:

<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 中设置验证属性,该方法选择正确的算法?

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].

我需要编写自定义代码来加密/解密 MD5case MembershipPasswordFormat.Encrypted:或我需要做什么,谢谢。

4

3 回答 3

2

这个博客解释得更好:

选择加入或退出 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

于 2014-04-24T13:34:33.323 回答
1

尝试:

 <machineKey compatibilityMode="Framework20SP2".... 

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

compatibleMode 属性的可能值为:Framework20SP1、Framework20SP2、Framework45

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

于 2014-06-18T09:00:56.603 回答
0

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

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

注意:compatibilityMode 中的小写“c”

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

于 2013-08-29T18:34:58.920 回答