Проблемы с настраиваемым ASP.NET RoleProvider

У меня возникают трудности с реализацией настраиваемого ASP.NET RoleProvider.

Прежде всего, позвольте мне показать вам соответствующие настройки в моем файле web.config:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="Login.aspx"
             name="FormsAuthentication"
             path="Default.aspx"
             timeout="20"/>
    </authentication>

    <membership defaultProvider="MembershipProvider">
      <providers>
        <clear />
        <add name="MembershipProvider"
             type="CompanyName.Security.MembershipProvider" />
      </providers>
    </membership>

    <roleManager defaultProvider="RoleProvider"
                 enabled="true">
      <providers>
        <clear />
        <add name="RoleProvider"
             type="CompanyName.Security.RoleProvider" />
      </providers>
    </roleManager>
  </system.web>
  <location path="Employees.aspx">
    <system.web>
      <authorization>
        <deny users="?"/>
        <allow roles="Employees"/>
      </authorization>
    </system.web>
  </location>
</configuration>

Вот код обработчика события кнопки входа в систему:

if (Membership.ValidateUser(tbxUsername.Text, tbxPassword.Text))
    Response.Redirect("./Employees.aspx");
else
{
    tbxUsername.Text = string.Empty;
    tbxPassword.Text = string.Empty;
    tbxUsername.Focus();
    lblLogin.Visible = true;
}

Боковое примечание на основе предложения FormsAuthentication.RedirectFromLoginPage ():
[Было предложено использовать FormsAuthentication.RedirectFromLoginPage () вместо Response.Redirect (). В конце концов, я хотел бы перенаправить пользователя на другую страницу в зависимости от его роли. Я не знаю, как FormsAuthentication.RedirectFromLoginPage () позволит мне это сделать, поскольку он не принимает URL-адрес перенаправления в качестве параметра. Кроме того, насколько я понимаю, я мог бы вызвать FormsAuthentication.SetAuthCookie () до Response.Redirect (), чтобы создать файл cookie аутентификации, который создает FormsAuthentication.RedirectFromLoginPage (). Пожалуйста, дайте мне знать, если мой мыслительный процесс здесь неправильный.]

Пройдя по источнику, я вижу, что Membership.ValidateUser () выполняет функцию ValidateUser () моего настраиваемого класса MembershipProvider. Однако, когда действительный пользователь входит в систему и перенаправляется на Employees.aspx, пользователь возвращается на Login.aspx **? ReturnUrl =% 2fEmployees.aspx **. Я предполагаю, что это связано с тем, что, хотя пользователь аутентифицируется, он / она не проходит авторизацию на ресурсе Employees.aspx.

Исходя из этого предположения, я создал точки останова для каждой функции в моем настраиваемом классе RoleProvider, чтобы увидеть, где что-то работает неправильно. Ни один из них не прерывает выполнение при отладке. Большая часть кода в моем RoleProvider выбрасывает NotYetImplementetExceptions, но я все равно ожидаю, что попаду в точки останова (и затем реализовал бы эти необходимые функции). Вот две реализованные мною упрощенные функции:

public override string[] GetRolesForUser(string username)
{
    return new string[1] {"Employees"};
}

public override bool IsUserInRole(string username, string roleName)
{
    return true;
}

Я предполагаю, что, поскольку код RoleProvider никогда не выполняется, что-то не так с моим файлом web.config.

Я искал ответ на этот вопрос последние два дня и безуспешно пробовал различные изменения. Кто-нибудь видит, где я ошибаюсь?

Заранее спасибо!


person Paul    schedule 09.11.2009    source источник


Ответы (3)


После аутентификации пользователя с помощью Membership.ValidateUser следует вызвать FormsAuthentication.RedirectFromLoginPage, а не Response.Redirect, чтобы создать билет проверки подлинности с помощью форм.

См. документацию MSDN для Membership.ValidateUser для примера.

ИЗМЕНИТЬ

Или, если вы хотите перенаправить на определенную страницу, вызовите FormsAuthentication.SetAuthCookie, чтобы создать билет проверки подлинности форм перед вызовом Response.Redirect.

Он перенаправляет аутентифицированных пользователей на default.aspx

На самом деле он перенаправляет обратно на страницу, которая была изначально запрошена, что не обязательно по умолчанию. Aspx

ИЗМЕНИТЬ 2

Также есть проблема с вашей конфигурацией:

  • Атрибут path должен указывать не на конкретную страницу (в вашем случае Default.aspx), а на корневой каталог сайта. По умолчанию используется "/", потому что большинство браузеров чувствительны к регистру и поэтому не будут отправлять cookie, если есть несоответствие регистра.

      <forms loginUrl="Login.aspx"
             name="FormsAuthentication"
             path="/"
             timeout="20"/>
    
person Joe    schedule 09.11.2009
comment
Я наткнулся на эту статью, но меня смутил тот факт, что функция FormsAuthentication.RedirectFromLoginPage () не запрашивает страницу, на которую следует перенаправить пользователя. Он перенаправляет аутентифицированных пользователей на default.aspx. Я хочу перенаправить пользователя в зависимости от его роли. ‹- Я добавлю это к своему вопросу. - person Paul; 09.11.2009
comment
Я добавил функцию FormsAuthentication.SetAuthCookie () до вызова Response.Redirect (), но меня по-прежнему перенаправляют обратно на Login.aspx? ReturnUrl =% 2fEmployees.aspx. - person Paul; 09.11.2009

Проверьте, находится ли пользователь в роли:

If (Roles.IsUserInRole("Employees"))
{
}

или попробуйте, если он работает без проверки ролей:

<allow users="*"/>

может помочь изменить конфигурацию:

<location path="Employees.aspx">
    <system.web>
      <authorization>        
        <allow roles="Employees"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
person Jan Remunda    schedule 09.11.2009
comment
Я отвечу на ваше первое предложение, обновив свой вопрос. Пользователь перенаправляется, как и ожидалось, когда я устраняю проверку ролей, как вы предлагали. Ваше третье предложение не перенаправляет пользователя должным образом, но если я удалю ‹deny users = * /› и оставлю только ‹allow roles = Employees /›, это сработает. Это приятно, но меня беспокоит то, что функции в моем настраиваемом RoleProvider все еще не вызываются. - person Paul; 09.11.2009
comment
и вы переопределили метод String [] GetRolesForUser (строковое имя пользователя)? - person Jan Remunda; 09.11.2009
comment
да, с возвращением новой строки [1] {Сотрудники}; (для тестирования) Однако я думаю, что критической проблемой здесь является то, что кажется, что ни одна из переопределенных функций не вызывается (потому что точки останова не достигаются). - person Paul; 09.11.2009

Я изменил значение пути (см. Ниже) с «Default.aspx» на «/», и теперь достигаются точки останова в настраиваемом RoleProvider!

Не работает:

<authentication mode="Forms">
  <forms loginUrl="Login.aspx"
         name="FormsAuthentication"
         path="Default.aspx"
         timeout="20"/>
</authentication>

Работает:

<authentication mode="Forms">
  <forms loginUrl="Login.aspx"
         name="FormsAuthentication"
         path="/"
         timeout="20"/>
</authentication>
person Paul    schedule 09.11.2009