我正在使用带有Forms身份验证的MVC 3。在我的控制器或方法上,我正在执行以下操作:
[Authorize (Roles = "developer")]
在这种情况下,我想检查用户是否已登录,如果没有,则将其返回到登录页面。但是,如果该用户的'IsInRole'检查返回false,则希望将其发送到一个不同的视图,该视图显示类似于“未经授权”的消息。如何最好地实现这样的功能?我希望避免创建新的授权属性,以便不必重构整个应用程序中的每个授权属性,但如果需要,我会采取这种方法。
我正在使用带有Forms身份验证的MVC 3。在我的控制器或方法上,我正在执行以下操作:
[Authorize (Roles = "developer")]
在这种情况下,我想检查用户是否已登录,如果没有,则将其返回到登录页面。但是,如果该用户的'IsInRole'检查返回false,则希望将其发送到一个不同的视图,该视图显示类似于“未经授权”的消息。一个自定义授权属性可以重写 HandleUnauthorizedRequest 方法来完成该工作:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// The user is not authenticated
base.HandleUnauthorizedRequest(filterContext);
}
else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
{
// The user is not in any of the listed roles =>
// show the unauthorized view
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Unauthorized.cshtml"
};
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
然后:
[MyAuthorize(Roles = "developer")]
public ActionResult Develop()
{
...
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// The user is not authenticated
base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Unauthorized.cshtml",
};
}
}