自定义授权

时间:2010-11-01 13:51:15

标签: asp.net-mvc authorization

我试图通过创建基本控制器并覆盖OnAuthorization方法来使用我自己的授权。

授权失败时工作正常,但当我的检查成功时,我得到一个401页面(但默认授权检查失败)。

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var roleAttribute = typeof(AuthorizeAttribute);
        var attributes = filterContext.ActionDescriptor.GetCustomAttributes(roleAttribute, true);
        if (attributes.Length == 0)
            attributes = GetType().GetCustomAttributes(roleAttribute, true);
        if (attributes.Length == 0)
            return;

        MvcHelper.Authenticate();


        foreach (AuthorizeAttribute item in attributes)
        {
            if (!Thread.CurrentPrincipal.IsInRole(item.Roles))
            {
                filterContext.Result = new RedirectResult("~/Error/Unauthorized/" + "?MissingRole=" + item.Roles);
                return;
            }
        }

        //how do I prevent the default authorization here?
    }

我尝试了filterContext.HttpContext.SkipAuthorization = true;,但没有用。

2 个答案:

答案 0 :(得分:0)

我通常在ActionFilter中执行此操作:https://gist.github.com/e297b435ceb8f022fb95

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext == null)
        throw new ArgumentNullException("FilterContext");

    if (AuthProvider == null)
        throw new ArgumentNullException("IAuthProvider");

    if (AuthProvider.Authenticate(filterContext) == false)
    {
        var req = filterContext.HttpContext.Request;

        var response = filterContext.HttpContext.Response;
        response.StatusCode = 401;
        response.AddHeader("WWW-Authenticate", "Basic realm=\"Emergidata\"");
        response.End();
    }
    else
    {
        var controller = filterContext.Controller as IAppController;
        controller.DynamicSession= AuthProvider.AuthProviderContext;
    }
}

答案 1 :(得分:0)

我会分两步完成:

  • 首先,我会保护整个应用程序,因此您必须明确列出那些应该对匿名用户可用的控制器,请阅读http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx上的“LogonAuthorize过滤器方法的限制”部分。在那里,您有一个全局应用的过滤器,用于限制对应用程序的访问,以及一个应用于您希望允许匿名访问的操作的属性。
  • 下一步是实现另一个过滤器,您应用于您希望用户具有特定角色或能力的那些操作。此过滤器将继承自AuthorizeAttribute
相关问题