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> раздел.

Другие вопросы по тегам