在我的ASP MVC项目中,我实现了OWIN CookieAuthentication。除了未经授权的请求外,所有工作都很好。 例如,考虑流程:
受限制:
[Authorize(Roles = "SomeRoleUserDontHaAssigned")]
public ActionResult SomeAction()...
当发生这种情况时,用户会被重定向到帐户/登录路线(这没关系),但他没有注销(我预期)。
这是预期的行为,以便我应该实现我自己的AuthorizeAttribute,我应该手动删除cookie(或调用Account / SignOut)?或者我错过了什么?
答案 0 :(得分:1)
我决定把它放在答案中,因为它可能不适合单一评论。
首先,让我们回到基础 - HTTP状态代码。在谈论身份验证和授权时,您有两个主要的代码 - 401和403。
来自RFC 7235规范:
<强> 3.1。 401未经授权(https://tools.ietf.org/html/rfc7235#section-3.1)
401(未授权)状态代码表示请求有 未应用,因为它缺少有效的身份验证凭据 对于目标资源。
<强> 6.5.3。 403禁止(https://tools.ietf.org/html/rfc7231#section-6.5.3)
403(禁止)状态代码表示服务器已理解 请求但拒绝授权。希望公开的服务器 为什么请求被禁止可以在响应中描述该原因 有效载荷(如果有的话)。
换句话说,401表示身份验证存在问题(用户未经过身份验证或未正确身份验证)。可以提供有效凭据并重试。同时,403表示权限存在问题。服务器知道用户是谁但拒绝访问 - 不应该使用相同的凭据重试。
OWIN CookieAuthentication只是坐在那里并侦听返回的401错误代码。如果它检测到这样的代码,则响应将被重定向到登录页面维护返回地址。
尽管名称为AuthorizeAttribute,但它实际上生成了401状态代码。 https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Http/AuthorizeAttribute.cs#L155
因此,用户被带到登录页面。
如果要更改它,可能需要实现自己的AuthorizeAttribute。然后,您可以检查用户是否已登录并返回403状态。如果用户尚未登录,则返回401。