我有一个带有Authorize属性的控制器。我希望在用户未获得授权的情况下不会创建控制器。但似乎确实如此。有没有办法改变这种行为并使Authorize生成401响应而不创建控件本身?
为什么我需要这个?我有一些面向管理员的控制器,仅针对经过身份验证的用户。它在基本控制器的构造函数中有一些逻辑。目前我必须检查User是否为null,这似乎是浪费。
答案 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);
}
}