gpt4 book ai didi

asp.net-mvc - 为什么 onAuthorization 在身份验证之前执行?

转载 作者:行者123 更新时间:2023-12-03 03:07:40 25 4
gpt4 key购买 nike

我正在尝试进行一些自定义授权,因此我创建了一个覆盖 OnAuthorization 方法的 Controller 。我还将 Authorize 属性应用于此 Controller 。问题是为什么在基本表单例份验证过程之前调用 OnAuthorization 方法?

我想在用户通过身份验证后对其进行授权。我错过了什么吗?

这是代码:

[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");
}
}
}

我测试的 Controller 类似于:

public class SecurityController : AuthorizationController
{

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

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

最佳答案

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;
}

当您像在示例中那样使用没有角色/用户的 AuthorizeAttribute 时 ([Authorize]),它基本上只是检查以确保在这种情况下用户已通过身份验证。

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

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)
};
}
}

关于asp.net-mvc - 为什么 onAuthorization 在身份验证之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9366085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com