我正在尝试实现 ActiveDirectoryMembership 提供程序,以便可以对活动目录使用表单身份验证。
我可以浏览到应用程序,并被重定向到登录页面。如果我输入错误的密码,我会得到正确的错误。如果我输入正确的密码,它会将我重定向到默认 URL (/Secure/Default.aspx),但会立即重定向回登录页面。我可以看到两个重定向,因为我使用的是提琴手。所以我确定它正在正确地针对 AD 进行身份验证,但仍将我带回登录页面。我也知道浏览器确实接受 cookie,因为我在应用程序中构建了一个测试页面来证明这一点。我已经在下面包含了 web.config 和相关代码,只是无法弄清楚我错过了什么......
编辑: 我发现如果我指定 UseUri 而不是 UseCookies,一切都会开始工作。但是我已经验证了我可以将数据存储在一个页面上的 cookie 中,并在另一个页面上检索它,那么为什么它不适用于身份验证部分呢?
编辑 2 我还从登录页面中删除了我的代码并使用了标准登录控件,同样的问题。
Web.config 文件:
<connectionStrings>
<add name="ADConnectionString" connectionString="LDAP://YNET" />
</connectionStrings>
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH"
path="/FormsAuth"
loginUrl="~/SignIn.aspx"
defaultUrl="~/Secure/Default.aspx"
timeout="20"
requireSSL="false"
protection="All"
slidingExpiration="true"
cookieless="UseCookies"
enableCrossAppRedirects="false"/>
</authentication>
<authorization>
<!-- Deny unauthenticated users will cause automatic redirect to the sign in page when using forms authentication. -->
<deny users="?"/>
<allow users="*"/>
</authorization>
<!-- For non AD passthrough authentication, specify the defaultProvider property -->
<membership defaultProvider="ActiveDirectoryMembershipProvider">
<providers>
<clear/>
<add name="ActiveDirectoryMembershipProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider"
connectionStringName="ADConnectionString"
attributeMapUsername="sAMAccountName"/>
</providers>
</membership>
</system.web>
登录页面:
bool bIsValid = System.Web.Security.Membership.ValidateUser(txtUsername.Text, txtPassword.Text);
//Authenticate the user credentials against the default membership provider specified in configuration
if (bIsValid)
{
System.Web.Security.FormsAuthentication.SetAuthCookie(txtUsername.Text, true);
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true);
}
else
{
//display error
....
}