为什么在授权之前执行onAuthorization?

mis*_*sha 14 authentication asp.net-mvc authorization

我正在尝试做一些自定义授权,所以我创建了一个覆盖该OnAuthorization方法的控制器.我还将该Authorize属性应用于此控制器.问题是为什么这个OnAuthorization方法被称为BEFORE基本表单认证过程?

我想在用户通过身份验证后授权用户.我错过了什么吗?

这是代码:

[Authorize]
    public class AuthorizationController : Controller
    {
        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            List<string> allowedControllers = new List<string>() { "SecurityController" };
            List<string> allowedActions = new List<string>() { "Index" };

            string controllerName = filterContext.Controller.GetType().Name;
            string actionName = filterContext.ActionDescriptor.ActionName;

            if (!allowedControllers.Contains(controllerName)
            || !allowedActions.Contains(actionName))
            {
                filterContext.Result = View("UnauthorizedAccess");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我测试的控制器是这样的:

public class SecurityController : AuthorizationController
{

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult AnotherIndex()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

Dis*_*ile 16

这样做的第一件事AuthorizeAttribute就是检查用户是否经过身份验证.如果不是,则会发出重定向到登录页面的时间.

AuthorizeAttribute基本包装认证检查与授权件:

protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
        if (httpContext == null) {
            throw new ArgumentNullException("httpContext");
        }

        IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated) {
            return false;
        }
Run Code Online (Sandbox Code Playgroud)

如果您在示例中使用AuthorizeAttribute而没有角色/用户([Authorize]),那么基本上只是检查以确保在这种情况下用户已经过身份验证.

我可能会更改您的代码以覆盖AuthorizeAttribute,而不是在您的控制器中执行此代码.您可以执行以下操作:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        filterContext.Result = CreateResult(filterContext);
    }

    protected ActionResult CreateResult(AuthorizationContext filterContext)
    {
        var controllerContext = new ControllerContext(filterContext.RequestContext, filterContext.Controller);
        var controller = (string)filterContext.RouteData.Values["controller"];
        var action = (string)filterContext.RouteData.Values["action"];
        // any custom model here
        var model = new UnauthorizedModel(); 

        // custom logic to determine proper view here - i'm just hardcoding it
        var viewName = "~/Views/Shared/Unauthorized.cshtml"; 

        return new ViewResult
        {
            ViewName = viewName,
            ViewData = new ViewDataDictionary<UnauthorizedModel>(model)
        };
    }
}
Run Code Online (Sandbox Code Playgroud)