Owin未经授权请求不签署用户

时间:2016-11-14 07:04:13

标签: asp.net-mvc owin

在我的ASP MVC项目中,我实现了OWIN CookieAuthentication。除了未经授权的请求外,所有工作都很好。 例如,考虑流程:

  1. 用户登录
  2. 用户点击未授权用户访问的端点。
  3. 受限制:

    [Authorize(Roles = "SomeRoleUserDontHaAssigned")]
    public ActionResult SomeAction()...
    

    当发生这种情况时,用户会被重定向到帐户/登录路线(这没关系),但他没有注销(我预期)。

    这是预期的行为,以便我应该实现我自己的AuthorizeAttribute,我应该手动删除cookie(或调用Account / SignOut)?或者我错过了什么?

1 个答案:

答案 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。