2016-11-14 78 views
0

在我的ASP MVC项目中,我实现了OWIN CookieAuthentication。除未经授权的请求外,所有程序都运行正常。 例如,考虑流动:Owin未经授权的请求未注销用户

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

通过限制:

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

发生这种情况时用户被重定向到帐户/登录路径(这是确定),但他没有得到注销(这是我所期望的)。

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

+1

你为什么期望这样的事情?作为用户,如果我每次遇到无法访问的资源时都必须重新登录,我会感到有点生气。你可以通过自定义的AuthorizeAttribute来做到这一点,但是你应该怎么做? –

+0

我明白你的观点。我应该详细说明一点:从用户体验角度来看,我完全同意你的看法。我真正想说的是:如果它已经重定向到登录页面,那么(并且只有这样)我才会期望首先注销用户,因为登录已登录用户的是什么?这不是很奇怪吗?另一方面,完全正确的解决方案当然是重定向到一些自定义的“访问被拒绝”页面。顺便说一句,那是在哪里设置的? –

+0

我无法完全理解您的问题,您如何期望用户在登录受限制的页面时应该注销?用户登录的唯一方式是在Cookie死亡或者通过身份验证管理器(authenticationManager.SignOut) – SaadK

回答

1

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

首先,让我们回到基础 - HTTP状态代码。有迹象表明,你有兴趣谈论身份验证和授权时,在两个主要的代码 - 从RFC 7235规格的401和403

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.

+0

感谢您的评论。这正是我为了你提到的原因而做的事情:http specs。问题似乎实际上是AuthorizeAttribute解释为401.很难理解背后的原因,但我想我们必须忍受它。标记你的答案,因为它给这个话题带来了完全的清晰。 –

相关问题