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)
归档时间: |
|
查看次数: |
29741 次 |
最近记录: |