Rob*_*vey 41 c# security asp.net-mvc roles
我正在使用这样的Authorize属性:
[Authorize (Roles="Admin, User")]
Public ActionResult Index(int id)
{
// blah
}
Run Code Online (Sandbox Code Playgroud)
当用户不在指定的角色时,我会收到一个错误页面(找不到资源).所以我也将HandleError属性放入其中.
[Authorize (Roles="Admin, User"), HandleError]
Public ActionResult Index(int id)
{
// blah
}
Run Code Online (Sandbox Code Playgroud)
现在,如果用户不在指定的角色,它将进入" 登录"页面.
当用户不符合所需角色之一时,如何让它转到未授权页面而不是登录页面?如果发生不同的错误,我如何将该错误与未授权错误区分开来并以不同方式处理?
Run*_*une 27
将这样的内容添加到web.config中:
<customErrors mode="On" defaultRedirect="~/Login">
<error statusCode="401" redirect="~/Unauthorized" />
<error statusCode="404" redirect="~/PageNotFound" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)
您显然应该创建/PageNotFound和/Unauthorized路由,操作和视图.
编辑:对不起,我显然没有彻底理解这个问题.
问题是,当AuthorizeAttribute执行过滤器时,它会确定用户不符合要求(他/她可能已登录,但角色不正确).因此,它将响应状态代码设置为401.这将由FormsAuthentication模块拦截,然后模块将执行重定向.
我看到两种选择:
禁用defaultRedirect.
创建自己的IAuthorizationFilter.派生AuthorizeAttribute并覆盖HandleUnauthorizedRequest.在此方法中,如果用户通过身份验证,请重定向到/ Unauthorized
我也不喜欢:defaultRedirect功能很好,而不是你想要自己实现的东西.第二种方法导致向用户提供视觉上正确的"您未经授权"页面,但HTTP状态代码将不是所需的401.
我不太了解HttpModules是否可以通过一个可容忍的黑客来规避这个问题.
编辑2:如何以下列方式实现自己的IAuthorizationFilter:从CodePlex下载MVC2代码并"借用"AuthorizeAttribute的代码.将OnAuthorization方法更改为
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (AuthorizeCore(filterContext.HttpContext))
{
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
// Is user logged in?
else if(filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// Redirect to custom Unauthorized page
filterContext.Result = new RedirectResult(unauthorizedUrl);
}
else {
// Handle in the usual way
HandleUnauthorizedRequest(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
where unauthorizedUrl是过滤器上的属性或从Web.config读取.
您也可以从AuthorizeAttribute继承并覆盖OnAuthorization,但最终您将编写一些已在AuthorizeAttribute中的私有方法.
你可以用两种方式做到这一点:
指定HandleError属性的错误,并给出应显示的视图:
[HandleError(ExceptionType = typeof(UnAuthorizedException),View ="UnauthorizedError")]
您可以指定几个不同的ExceptionTypes和视图
| 归档时间: |
|
| 查看次数: |
26304 次 |
| 最近记录: |