C# 切换Web服务器会停止ASP.Net成员身份验证用户/密码

C# 切换Web服务器会停止ASP.Net成员身份验证用户/密码,c#,asp.net,sql-server,asp.net-membership,membership-provider,C#,Asp.net,Sql Server,Asp.net Membership,Membership Provider,我刚刚创建了一个新的Web服务器(Windows Server 2012),正在尝试登录我们的网站(旧Web服务器文件的直接副本)。从旧的web服务器上看,一切都很好。尝试从新服务器登录时,我的密码被拒绝。我知道这些请求正在通过数据库服务器上的SQL Profiler访问DB服务器 旧设置将网站和数据库放在同一台服务器上,新设置只是将网站移动到专用服务器上。数据库保持不变 我能想到的唯一一件事是,密码是使用旧服务器的机器密钥进行散列/加密的,尽管我们确实在web.config中指定了一个机器密钥

我刚刚创建了一个新的Web服务器(Windows Server 2012),正在尝试登录我们的网站(旧Web服务器文件的直接副本)。从旧的web服务器上看,一切都很好。尝试从新服务器登录时,我的密码被拒绝。我知道这些请求正在通过数据库服务器上的SQL Profiler访问DB服务器

旧设置将网站和数据库放在同一台服务器上,新设置只是将网站移动到专用服务器上。数据库保持不变

我能想到的唯一一件事是,密码是使用旧服务器的机器密钥进行散列/加密的,尽管我们确实在web.config中指定了一个机器密钥,所以这不应该是一个问题

<!-- Key information as using encrypted passwords     -->
    <machineKey validationKey="xxx,IsolateApps" decryptionKey="xxx,IsolateApps" validation="3DES"/>
    <!-- Membership, Role & Personalisation Providers     -->
    <membership>
        <providers>
            <remove name="AspNetSqlMembershipProvider"/>
            <add name="AspNetSqlMembershipProvider" connectionStringName="SqlAspNetDB" 
         type="System.Web.Security.SqlMembershipProvider, System.Web,    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
         enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" 
         applicationName="/" requiresUniqueEmail="false" passwordFormat="Clear" 
         maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" passwordStrengthRegularExpression="" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0"/>
        </providers>
    </membership>

是的,可能是密码问题。我的直觉是

在数据库中,执行:

从aspnet_成员身份中选择PasswordFormat,其中UserId={YourUserId}

如果返回的值不是0,那么这很可能就是问题所在。配置设置中的密码格式必须与数据库中记录的密码格式匹配。passwordFormat=“Hashed”是最流行的选择。(即从数据库的角度来看,PasswordFormat=1)

因此,如果在数据库中为“1”,请将配置设置为passwordFormat=“Hashed”


其他选项为:“加密”(2)

假设两台服务器上的machineKey配置完全相同。。。 我看到您正在使用IsolateApps

来自MSDN:“IsolateApps修饰符使ASP.NET使用应用程序的应用程序ID为服务器上的每个应用程序生成唯一密钥”

上面链接中的Web场部署注意事项部分显示了machineKey配置应该如何完成

我以前从未经历过这种情况,所以不要完全相信下面几句话。。。 除非您能够以某种方式使新应用程序具有相同的应用程序标识,否则这些密码现在只能由原始应用程序解密。我想你有两个选择:

  • 如果您不关心密码恢复,请切换到哈希密码格式。有关更多帮助,请参见此:

  • 如果您希望坚持使用加密密码,并且希望维护密码,则需要从第一个应用程序中的一些手工制作的.Net代码中以明文形式提取所有密码(类似于上面使用的代码)。然后在正确重新配置machineKey后,重新加密这些密码并存储到数据库中。此链接适于解密密码:


  • 注意:可能不需要这样说,但在应用于所有用户帐户记录之前,请先使用一个用户帐户进行测试。:-)

    这个问题似乎离题了,因为它针对的是密码格式正在以加密方式返回。web.config中的设置也被设置为Encrypted,所以这应该可以,不是吗?在您发布的web.config中,我看到passwordFormat=“Clear”?如果在数据库和配置中都设置为Encrypted,并且排除了密码问题,请从aspnet\u Users/aspnet\u成员中选择一个用户记录,将该用户记录的密码格式更新为0。在配置中将passwordFormat设置为“Clear”,然后将密码重新设置为某个值。。然后尝试另一次登录。成功了。我直接在数据库中设置密码和PasswordFormat,然后在web.config中将PasswordFormat设置为Clear。这证实了这是一个加密问题,很可能与用于加密的机器密钥有关。问题是为什么在web.config中设置机器密钥不能像预期的那样工作?给出了这个新信息,我添加了另一个答案