2

Это проект MVC 3. Просто для тестирования у меня естьКак заставить RoleProvider работать?

public class MyRoleProvider : RoleProvider 
{ 
    public override string[] GetRolesForUser(string username) 
    { 
     return new string[] { "0", "1", "2", "4" }; 
    } 

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

Я зарегистрирую его в web.config. И тогда, если я настрою стандартный SqlMemberShipProvider, что-то вроде следующего приведет к срабатыванию моего GetRolesForUser.

[Authorize(Roles="4")] 
public class AdminController : Controller 
{ //... 

Однако я не хочу использовать стандартный SqlMemberShipProvider. Я определил собственным AuthorizeAttribute следующим образом, просто для проверки:

public class MyAuthorize : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     bool result = true; 
     return result; 
     return base.AuthorizeCore(httpContext); 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
    } 
} 

Теперь, следующий не заставит MyRoleProvider.GetRolesForUser стрелять больше.

[MyAuthorize(Roles="4")] 
public class AdminController : Controller 
{ //... 

выше будет вызывать MyAuthorize.AuthorizeCore и MyAuthorize.OnAuthorization, но не методы в MyRoleProvider. Каковы отношения между MemberShipProvider, RoleProvider и AuthorizedAttribute? Когда эти отношения определены или настроены?

Спасибо.

ответ

2

Если вы не хотите использовать стандартные SqlRoleProvider, не настраивать. Я обычно комментирую это или удаляю.

Ваш конфиг будет выглядеть примерно так:

<roleManager defaultProvider="MyRoleProvider" enabled="true"> 
    <providers> 
    <clear /> 
    <!--<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />--> 
    <add name="MyRoleProvider" type="Full.Namespace.Of.MyRoleProvider" applicationName="/" /> 
    </providers> 
</roleManager> 
+0

Я хотел бы удалить исходное сообщение. Я, должно быть, ошибся где-то во время моего тестирования. Я начал все сначала и обнаружил, что MyRoleProvider действительно вызван, даже когда я использую атрибут MyAuthorize. Спасибо всем, кто ответил –

0

Я не знаю, если это опечатка, но это base.AuthorizeCore, что будет проверять пользователей в роли так

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    bool result = true; 
    return result; 
    return base.AuthorizeCore(httpContext); 
} 

возвращение всегда верно и не срабатывают базовый метод. Попробуйте удалить

bool result = true; 
return result; 

Вот отрывок из источника MVC

// This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method. 
    protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 

     if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
      return false; 
     } 

     if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
      return false; 
     } 

     return true; 
    } 
+0

Спасибо. Это не опечатка. Я захватил поток событий, чтобы увидеть, где я могу поместить свой собственный код авторизации (я пытаюсь использовать учетную запись Google, которую я успешно реализовал в другом месте, независимо от ASP.NET MemberhipProvider). На самом деле я не выяснил связь между атрибутом MemberShipProvider и Authorize. Что это значит, если переопределить AuthorizeCore, но продолжать использовать стандартный MemberhipProvider? Когда я использую свой RoleProvider, как я могу захватить AuthorizeCore? –

+0

Это не опечатка, а какой-то старый код. –

 Смежные вопросы

  • Нет связанных вопросов^_^