我的Controller类被装饰了一个AuthorizeAttribute来保护动作。
[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
...
}
任何时候,当一个动作被调用,但用户至少不是 "用户2级 "角色时,用户会被自动重定向到登录页面,URL如下:
http:/localhost:1436AccountLogin?ReturnUrl=%2fBuy。
如果用户已经登录,但没有正确的安全级别,这不是一个最佳的行为! 更合理的做法是显示一个页面,通知用户缺少的级别,而不是显示登录页面。
我可以怎么做来定制这个行为?
能否以某种方式将所需的用户级别传递给登录动作?
你可以像这样建立自己的授权属性。
public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}
我用这个来重定向到一个特定的俱乐部 在我建立的一个俱乐部会员网站。 你可以根据自己的需要来调整这个属性。 另外,在我的例子中,我确实重定向到登录页面,但我检查用户是否被授权,如果是,则显示一条消息,说明他们没有正确的权限。 毫无疑问,你也可以在ViewData或TempData中添加一些东西来显示在页面上,但我还没有试过。
编辑RC中已经不存在AuthorizationContext.Cancel了。"filterContext.Result is HttpUnauthorizedResult "似乎已经足够了。filterContext.Cancel(ASP.NET MVC)怎么了?
距离上次的回答,时间已经过去了很久。
自2009年以来,在授权领域取得了很多进展。特别是,OASIS(SAML背后的那些)已经标准化了XACML,即eXtensible Access Control Markup Language。
XACML给开发者提供了
XACML与NIST推荐的基于属性的访问控制是一致的。
请看一下这个 回答 更多细节。