我有一个操作我只想限制角色“Admin”。我这样做是这样的:在[Authorize]失败后显示404错误页面
[Authorize(Roles = "Admin")]
public ActionResult Edit(int id)
下控制器/编辑/ 1路手动去我重定向到登录页面后。那么,也许这并不坏,但我想显示404而不是它,并试图坚持使用它的属性。那可能吗?
我有一个操作我只想限制角色“Admin”。我这样做是这样的:在[Authorize]失败后显示404错误页面
[Authorize(Roles = "Admin")]
public ActionResult Edit(int id)
下控制器/编辑/ 1路手动去我重定向到登录页面后。那么,也许这并不坏,但我想显示404而不是它,并试图坚持使用它的属性。那可能吗?
这可能吗?
当然,你可以写一个自定义授权属性:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/401.cshtml"
};
}
}
,然后使用它:
[MyAuthorize(Roles = "Admin")]
public ActionResult Edit(int id)
备注:你可能想显示401或403页,如果用户未被授权,而不是404未找到文件。
其他人可能会知道这可能与[Darin的答案]中的另一个相结合(http://stackoverflow.com/questions/5314673/user-is-in-role-admin-but-authorizeroles-admin-不会进行身份验证)。我已经做到了这一点,它出色地工作。结合这两者包括来自这个答案的'HandleUnauthorizedRequest'方法与来自另一个答案的'OnAuthorization'方法在同一个类中。保持Darin的良好工作! – Ben 2012-07-04 12:06:02
@你能分享你的解决方案吗? – Daniel 2014-07-11 14:03:38
@Daniel我可以试试!自从我看了这段代码已经有2年了,但我会在一分钟内做出新的答案。 – Ben 2014-07-11 15:10:53
在回应@丹尼尔对我的评论@ Darin的答案的评论这是我的实现:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
string cookieName = FormsAuthentication.FormsCookieName;
if (!filterContext.HttpContext.User.Identity.IsAuthenticated ||
filterContext.HttpContext.Request.Cookies == null ||
filterContext.HttpContext.Request.Cookies[cookieName] == null
)
{
HandleUnauthorizedRequest(filterContext);
return;
}
var authCookie = filterContext.HttpContext.Request.Cookies[cookieName];
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(',');
var userIdentity = new GenericIdentity(authTicket.Name);
var userPrincipal = new GenericPrincipal(userIdentity, roles);
filterContext.HttpContext.User = userPrincipal;
base.OnAuthorization(filterContext);
}
// Redirects unauthorized users to a "401 Unauthorized" page
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Error/401.cshtml"
};
}
}
只是一个评论,也许你应该表现出一个401或403 http://en.wikipedia.org/ wiki/List_of_HTTP_status_codes#4xx_Client_Error – Danny 2012-02-29 17:12:17
哦,在形式上你是对的,但我不想让其他人知道动作名称是正确的(这可能会暗示它) – deha 2012-02-29 17:14:38
我相信这是[Asp.net MVC Authorize属性,重定向到自定义“无权限”页面](http://stackoverflow.com/q/4457476/267448) – 2012-02-29 17:15:28