在ASP。NET MVC中,你可以用AuthorizeAttribute标记一个控制器方法,像这样:
[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
// ...
}
这意味着,如果当前登录的用户不在“CanDeleteTags”角色中,控制器方法将永远不会被调用。
不幸的是,对于失败,AuthorizeAttribute返回HttpUnauthorizedResult,它总是返回HTTP状态代码401。这将导致重定向到登录页面。
如果用户没有登录,这是完全有意义的。然而,如果用户是已经登录,但不是所需的角色,将他们发送回登录页面会令人困惑。
AuthorizeAttribute似乎合并了身份验证和授权。
这似乎是ASP中的一个疏忽。NET MVC,还是我错过了什么?
我不得不编写一个DemandRoleAttribute来分隔这两个对象。当用户未经过身份验证时,它返回HTTP 401,将用户发送到登录页面。当用户已登录,但不是所要求的角色时,它会创建一个NotAuthorizedResult。目前这将重定向到一个错误页面。
难道我没必要这么做吗?