【问题标题】:Owin unauthorized request not signing out userOwin 未经授权的请求未注销用户
【发布时间】:2016-11-14 07:04:13
【问题描述】:

在我的 ASP MVC 项目中,我实现了 OWIN CookieAuthentication。除了未经授权的请求外,一切都运行良好。 例如,考虑流程:

  1. 用户登录
  2. 用户点击了用户无权访问的端点。

通过以下方式限制:

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

当这种情况发生时,用户会被重定向到 Account/Login 路由(这没问题),但他并没有被注销(这是我所期望的)。

这是预期的行为,因此我应该实现自己的 AuthorizeAttribute,我应该在其中手动删除 cookie(或调用 Account/SignOut)?还是我错过了什么?

【问题讨论】:

  • 你为什么会期待这样的事情?作为一个用户,如果我每次点击我无权访问的资源时都必须重新登录,我会有点生气。您可以通过自定义 AuthorizeAttribute 来做到这一点,但您应该这样做吗?
  • 我明白你的意思。我应该详细说明一下:从用户体验的角度来看,我完全同意你的看法。我真正想说的是:如果它已经重定向到登录页面,那么(并且只有那时)我希望首先注销用户,因为登录已经登录的用户有什么意义?这真的很奇怪吗?另一方面,完全正确的解决方案当然是重定向到一些自定义的“拒绝访问”页面。顺便说一句,这是在哪里设置的?
  • 我不能完全理解你的问题,如果用户点击受限页面,你如何期望他被注销?记录用户的唯一方法是当 cookie 消失或您通过身份验证管理器 (authenticationManager.SignOut) 注销用户时
  • 嗯,我也不希望他被重定向到帐户/登录,首先。但是自从他们选择这样做以来,我的问题是关于退出的预期想法是什么-这也是他们想要的,我错过了还是他们就这样离开了?从书上看,我的期望是返回 403 禁止状态代码,仅此而已。然后我最终会拦截 403 并提供自定义未经授权的错误页面。但是这种重定向显然会进入该过程。

标签: asp.net-mvc owin


【解决方案1】:

我决定将其放在答案中,因为它可能不适合单个评论。

首先,让我们回到基础 - HTTP 状态代码。在谈论身份验证和授权时,您对两个主要代码感兴趣 - 401 和 403。

来自 RFC 7235 规范:

3.1. 401 未授权 (https://www.rfc-editor.org/rfc/rfc7235#section-3.1)

401(未授权)状态码表示请求已经 未应用,因为它缺少有效的身份验证凭据 为目标资源。

6.5.3。 403 禁止 (https://www.rfc-editor.org/rfc/rfc7231#section-6.5.3)

403(Forbidden)状态码表示服务器理解 请求但拒绝授权。希望公开的服务器 为什么请求被禁止可以在响应中描述该原因 有效载荷(如果有)。

也就是说,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。

【讨论】:

  • 感谢您的评论。这正是我最终做的事情,原因与您提到的相同:http 规范。问题似乎实际上是 AuthorizeAttribute 将两者都解释为 401。很难理解其背后的原因,但我想我们必须忍受它。标记您的答案,因为它使主题更加清晰。
猜你喜欢
  • 2018-06-06
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2019-09-18
相关资源
最近更新 更多