ASP.NET会员提供程序重置远程服务器上的密码失败

时间:2013-09-14 03:53:58

标签: asp.net asp.net-membership windows-server-2008 .net-4.5

我的.NET 4 Web窗体应用程序上的PasswordRecovery控件出现问题。我正在使用ASP.NET成员资格提供程序和表单身份验证。我在Windows 2008R2服务器上运行IIS7。

当应用程序在我的公司网络内的Win2K8服务器上运行时,一切正常,但当应用程序部署到Rackspace或客户端Win2K8框时,我的ResetPassword.aspx页面会获得 302“对象移动“响应,然后重定向到我的Login.aspx页面,并且不会发送重置密码电子邮件。

以下是Fiddler报道的内容:

enter image description here

以下是Fiddler的响应标题详细信息:

enter image description here

我在标准帐户目录中拥有所有登录名和密码页,并且有自己的web.config

enter image description here

以下是帐户目录的web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</configuration>

以下是该应用的web.config部分(我在适当的地方缩短了它们):

<authentication mode="Forms">
   <forms name=".ASPXAUTH" loginUrl="~/Account/Login.aspx" 
                           defaultUrl="~/" 
                           protection="All" 
                           cookieless="UseDeviceProfile" 
                           enableCrossAppRedirects="false" />
</authentication>
<membership defaultProvider="MyCustomMembershipProvider">
   <providers>
      <clear />
      <add connectionStringName="MyString" 
           enablePasswordRetrieval="false"           
           enablePasswordReset="true" 
           requiresQuestionAndAnswer="false"
           applicationName="/" 
           name="MyCustomMembershipProvider" 
           type="MyCustomMembershipProviderType" />
   </providers>
</membership>
<authorization>
   <deny users="?" />
</authorization>

我不相信这是一个SMTP问题,因为我可以使用Rackspace框上的telnet成功ping邮件服务器和端口,但是当我运行ResetPassword页面时,我仍然得到302。 此外,我公司网络内的服务器上的一切正常。

此外,帐户目录在Rackspace服务器上具有完全权限。

我查看了this SO answer,它提供了修复web.config的解决方案,允许匿名访问获取302的页面,但我的“帐户”文件夹允许对该页面中的每个页面进行所有访问。该答案中的另一个解决方案与关闭我<modules runAllManagedModulesForAllRequests="true">中的web.config有关,我不确定在这里适用,因为我没有使用MVC路由。 (尽管如此,我很乐意对此予以纠正!)

Rackspace服务器上是否有一些我需要查看的文件权限或用户权限,或者我在web.config中遗漏了什么?

我面临着非常密切的客户截止日期,所以我真的可以使用一些帮助。谢谢!

更新。更多代码按要求发布:

PasswordRecovery Control Markup在这里:

<asp:PasswordRecovery ID="PasswordReset" 
                      runat="server" 
                      EnableViewState="false" 
                      ClientIDMode="Static" 
                      RenderOuterTable="false"
                      onverifyinguser="OnVerifyingUser" 
                      onsendingmail="OnSendingMail">
        <UserNameTemplate>
            <!-Here is there is just two Label and Input pairs. 
               One pair for user email, one pair for their db instance -->  
        </UserNameTemplate>
</asp:PasswordRecovery>

OnSendingMail功能在这里:

protected void OnSendingMail(object sender, MailMessageEventArgs e)
{            
     e.Message.Subject = "MySubject";
     e.Message.IsBodyHtml = true;
     e.Message.Body = "ItsHtmlInRealLife";
}

2 个答案:

答案 0 :(得分:0)

这是我在你的问题中注意到的。 web.config应该如下所示 -

它基本上限制匿名访问〜/ Account文件夹内的每个页面,除了三个页面 - Login.aspx,ResetPassword.aspx和Register.aspx。

帐户web.config

<?xml version="1.0"?>
<configuration>

  <location path="Login.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <location path="ResetPassword.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <location path="Register.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>

</configuration>

Root web.config

删除授权标记。基本上,您要说您网站中的所有页面都需要登录。

这不是一种正确的做法;您至少需要Home Page和Login.aspx才能匿名访问。

<authorization>
   <deny users="?" />
</authorization>

答案 1 :(得分:0)

问题在于我们的一些自定义成员资格提供程序代码,以及我们在远程服务器上的错误记录。这不是web.config的问题。感谢大家帮忙。