Включить роли без (или с фиктивным) поставщика ролей

Я следую за этой статьей, в которой описано, как назначать роли пользователям, когда они входят в систему с помощью аутентификации по формам:

public void Application_AuthenticateRequest( Object src , EventArgs e )
{
   if (!(HttpContext.Current.User == null))
   {
      if (HttpContext.Current.User.Identity.AuthenticationType == "Forms" )
      {
      System.Web.Security.FormsIdentity id;
      id = (System.Web.Security.FormsIdentity)HttpContext.Current.User.Identity;
      String[] myRoles = new String[2];
      myRoles[0] = "Manager";
      myRoles[1] = "Admin";
      HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);
      }
   }
}

Я поместил логику ролей в обработчик событий, поэтому мне в принципе не нужен поставщик ролей. Тем не менее, чтобы запустить это, кажется, что я должен включить поставщика ролей в web.config, К сожалению, если бы я просто поставил:

<roleManager enabled="true"/>

это приводит к ошибкам во время выполнения, связанным с неудачным подключением к серверу SQL, как если бы я выбрал AspNetSqlRoleProvider как поставщик ролей.

Что я должен сделать, чтобы роли работали таким образом? Как я могу выбрать не использовать поставщика ролей или как реализовать фиктивного (если это имеет смысл)?

1 ответ

Решение

Вам не нужно включать roleManager в web.config - в конце концов, люди использовали роли с.NET 1.x до появления roleManager.

Одна вещь, которая roleManager сделает для вас, что вы не сделали в вашем коде установлено Thread.CurrentPrincipal в HttpContext.Current.User, Если вы полагаетесь на это (например, используя PrincipalPermissionAttribute), то вам нужно добавить это:

Thread.CurrentPrincipal = HttpContext.Current.User;

В противном случае, я ожидаю, что это сработает: какие симптомы вы видите, что заставляет вас думать, что это не работает?

Что касается реализации манекена RoleProviderэто достаточно просто: например, посмотрите эту статью MSDN.

Вам нужно только реализовать GetRolesForUser а также IsInRole методы; другие методы могут просто бросить NotSupportedException,

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