2

这是一个 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 是什么关系?何时定义或配置这些关系?

谢谢。

4

2 回答 2

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>
于 2012-03-29T14:31:06.157 回答
0

我不知道这是否是一个错字,但它是 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;
    }
于 2012-03-29T13:59:15.583 回答