ActiveDirectoryMembershipProvider всегда перенаправляет на страницу входа
Я пытаюсь реализовать поставщик ActiveDirectoryMembership, чтобы я мог использовать проверку подлинности с помощью форм в активном каталоге.
Я могу перейти к приложению и быть перенаправленным на страницу входа. Если я введу неверный пароль, я получу правильную ошибку. Если я введу правильный пароль, он перенаправит меня на URL-адрес по умолчанию (/Secure/Default.aspx), но сразу же будет перенаправлен обратно на страницу входа. Я вижу два перенаправления, потому что я использую Fiddler. Так что я точно знаю, что он аутентифицируется на AD правильно, но все же возвращает меня на страницу входа. Я также знаю, что браузер принимает куки, потому что я создал тестовую страницу в приложении, чтобы доказать это. Я включил 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
....
}
1 ответ
Проблема с файлами cookie (и, вероятно, проблема с входом в систему) связана с тем, что вы устанавливаете путь для файлов cookie: /FormsAuth
, Это означает, что cookie действителен только для этого URL-пути и в противном случае будет удален. Кроме того, ваш <authorization>
раздел можно немного подправить, как я настроил в следующем полном обновлении вашего частичного файла Web.config:
<connectionStrings>
<add name="ADConnectionString" connectionString="LDAP://YNET" />
</connectionStrings>
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH"
path="/"
loginUrl="~/SignIn.aspx"
defaultUrl="~/Secure/Default.aspx"
timeout="20"
requireSSL="false"
protection="All"
slidingExpiration="true"
cookieless="UseCookies"
enableCrossAppRedirects="false"/>
</authentication>
<authorization>
<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>
<location path="Secure">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
Если /Secure
папка действительно единственная папка, которую вы хотите защитить с помощью логина, тогда вышеописанное работает, но если вы хотите заблокировать все, кроме страницы логина, вам просто нужно <deny users "?" />
в твоем главном <authorization>
раздел.