我有一个非常奇怪的问题。我有一个使用.NET Membership API提供登录功能的Web应用程序。
使用WebDev 4.0服务器在我的本地开发计算机上运行良好。
我正在使用带有一些URL重写的.NET 4.0,但不在需要登录的页面上。
我有一台带有IIS7的Windows Server 2008
但是,Membership API似乎无法在服务器上运行。我已经设置了远程调试,LoginUser控件的LoginUser.LoggedIn事件被激活,但MembershipUser为null。我没有得到关于用户名/密码无效的答案,所以它似乎正在认识它。
如果我输入的用户名/密码无效,我会收到无效的用户名/密码响应。
一些代码,如果它有帮助:
<asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="validation-error-list" ValidationGroup="LoginUserValidationGroup"/>
<div class="accountInfo">
<fieldset class="login">
<legend>Account Information</legend>
<p>
<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Username:</asp:Label>
<asp:TextBox ID="UserName" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName"
CssClass="validation-error" Display="Dynamic" ErrorMessage="User Name is required." ToolTip="User Name is required."
ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
</p>
<p>
<asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label>
<asp:TextBox ID="Password" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password"
CssClass="validation-error" Display="Dynamic" ErrorMessage="Password is required." ToolTip="Password is required."
ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
</p>
<p>
<asp:CheckBox ID="RememberMe" runat="server"/>
<asp:Label ID="RememberMeLabel" runat="server" AssociatedControlID="RememberMe" CssClass="inline">Keep me logged in</asp:Label>
</p>
</fieldset>
<p class="login-action">
<asp:Button ID="LoginButton" runat="server" CommandName="Login" CssClass="submitButton" Text="Log In" ValidationGroup="LoginUserValidationGroup"/>
</p>
</div>
和背后的代码:
protected void Page_Load(object sender, EventArgs e)
{
LoginUser.LoginError += new EventHandler(LoginUser_LoginError);
LoginUser.LoggedIn += new EventHandler(LoginUser_LoggedIn);
}
void LoginUser_LoggedIn(object sender, EventArgs e)
{
// this code gets run so it appears logins work
Roles.DeleteCookie(); // this behaviour has been removed for testing - no difference
}
void LoginUser_LoginError(object sender, EventArgs e)
{
HtmlGenericControl htmlGenericControl = LoginUser.FindControl("errorMessageSpan") as HtmlGenericControl;
if (htmlGenericControl != null) htmlGenericControl.Visible = true;
}
我对“登录”表单进行了“捣乱”,我得到了以下Cookie-Set标题:
Set-Cookie: ASP.NET_SessionId=lpyyiyjw45jjtuav1gdu4jmg; path=/; HttpOnly
Set-Cookie: .ASPXAUTH=A7AE08E071DD20872D6BBBAD9167A709DEE55B352283A7F91E1066FFB1529E5C61FCEDC86E558CEA1A837E79640BE88D1F65F14FA8434AA86407DA3AEED575E0649A1AC319752FBCD39B2A4669B0F869; path=/; HttpOnly
Set-Cookie: .ASPXROLES=; expires=Mon, 11-Oct-1999 23:00:00 GMT; path=/; HttpOnly
我不知道这里有什么用处,因为它显然是加密的,但我发现.APXROLES cookie没有任何有趣的价值。它似乎无法注册cookie,但通过了身份验证。
更新
尝试过经典和集成模式:相同的行为
ASP.NET用户NETWORK SERVICE(NT AUTHORITY / NETWORK SERVICE)拥有所有aspnet_ *角色的成员资格。
答案 0 :(得分:0)
确保在IIS中将formsauth设置为安全类型。
在此处查看身份验证类型:http://learn.iis.net/page.aspx/142/understanding-iis-url-authorization/