Как заставить RoleProvider работать? - PullRequest
2 голосов
/ 29 марта 2012

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

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 ]

2 голосов
/ 29 марта 2012

Если вы не хотите использовать стандартный 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 голосов
/ 29 марта 2012

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

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

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

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...