为非授权用户授予属性创建的控制器

时间:2014-10-21 06:39:34

标签: asp.net-mvc

我有一个带有Authorize属性的控制器。我希望在用户未获得授权的情况下不会创建控制器。但似乎确实如此。有没有办法改变这种行为并使Authorize生成401响应而不创建控件本身?

为什么我需要这个?我有一些面向管理员的控制器,仅针对经过身份验证的用户。它在基本控制器的构造函数中有一些逻辑。目前我必须检查User是否为null,这似乎是浪费。

1 个答案:

答案 0 :(得分:0)

您可以从AuthorizeAttribute派生并按照您想要的方式处理它。请求将首先点击此重写方法,以便您有机会决定是允许进一步提供请求还是拒绝请求。您还可以选择忽略特定方法,例如通过添加AllowAnonymous属性来登录,或者通过从Attribute类派生来定义您自己的属性。

以下是一个工作示例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class RdbiAuthorizationAttribute : AuthorizeAttribute
{
    /// <summary>
    /// Verifies that the logged in user is a valid organization user.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        Guard.ArgumentNotNull(filterContext, "filterContext");
        Guard.ArgumentNotNull(filterContext.Controller, "filterContext.Controller");

        bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(
            typeof(AllowAnonymousAttribute), inherit: true)
                                 || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                                     typeof(AllowAnonymousAttribute), inherit: true);

        if (skipAuthorization)
        {
            return;
        }

        if (string.IsNullOrEmpty(filterContext.HttpContext.User.Identity.Name))
            throw new AuthenticationException("User must be logged in to access this page.");

        var controller = filterContext.Controller as BaseController;
        if (controller != null)
        {
            var user = controller.GetUser();

            if (user == null)
            {
                throw new InvalidOperationException(string.Format("Logged in user {0} is not a valid user", filterContext.HttpContext.User.Identity.Name));
            }
        }

        base.OnAuthorization(filterContext);
    }
}