Authentication Web API 2、OWIN身份验证、注销和#x27;t注销

Authentication Web API 2、OWIN身份验证、注销和#x27;t注销,authentication,asp.net-web-api,owin,asp.net-web-api2,Authentication,Asp.net Web Api,Owin,Asp.net Web Api2,我正在做一些研究工作,以期使用承载令牌作为身份验证机制(即AngularJS UI,在Web API[2]项目中通过OWIN进行身份验证) 我的登录工作正常,角色信息和其他一切都正常,但我无法获得要注销的令牌 我的启动配置如下: OAuthOptions = new OAuthAuthorizationServerOptions() { TokenEndpointPath = new PathString("/Token"), Provider = new Application

我正在做一些研究工作,以期使用承载令牌作为身份验证机制(即AngularJS UI,在Web API[2]项目中通过OWIN进行身份验证)

我的登录工作正常,角色信息和其他一切都正常,但我无法获得要注销的令牌

我的启动配置如下:

OAuthOptions = new OAuthAuthorizationServerOptions() {
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
    AllowInsecureHttp = true
};
我的注销操作很简单:

public HttpResponseMessage Logout() {
    var authentication = HttpContext.Current.GetOwinContext().Authentication;
    authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

    return new HttpResponseMessage(HttpStatusCode.OK);
}
为了简洁起见,我省略了所有的身份验证内容,但为了确认我在设置令牌时使用的是ExternalBearer

在我的UI中,我将令牌存储在本地存储中(这里不涉及cookies,这是一个深思熟虑的设计决策)。因此,我的UI上有一个注销按钮,点击注销操作,代码运行正常

但是,如果我随后点击API上需要授权的操作,则请求仍然会通过(即,即使用户本应已注销,但用户仍然经过身份验证)

要么我错过了一些非常明显的东西(这不是第一次;-),要么这里发生了一些更基本的事情——最后我在ping@leastprivilege,因为我知道这是他们的领域

任何帮助或见解都将受到感激


我唯一能想到的是,令牌在服务器/API端是无状态的,因此不能过期或注销

如果是这样,我想我可以:

a) 添加一个刷新令牌,该令牌将创建一个在过去过期的新令牌-这会起作用吗?-实际上取消它,它会发出一个新的令牌。。。旧的仍然有效

b) 将承载令牌存储在数据库中,并每次检查,在注销时删除令牌(自然盐渍、哈希等)。然而,这只是让我们回到有状态服务器

c) 当有人显式注销时,我可以(也将)从本地存储中删除令牌,但是如果坏人可以拦截令牌,则令牌在技术上仍然有效。当然,所有这些都将结束SSL,这将抑制坏人/女孩

d) 也许这就是为什么很多人将承载令牌存储在cookie中(作为一种存储机制),因此,一旦您注销,至少在下次刷新时会删除cookie


很抱歉,上面的内容有点像脑筋急转弯,只是想抢先回答任何问题,只要我知道承载令牌位于客户端,那么我认为您不需要服务器端的“注销”功能。只要从客户端本地存储中删除令牌,您就会注销。

因为OAuth不是身份验证协议,所以没有注销的概念。删除客户端上的访问令牌-这就是您所能做的


如果您想使服务器端的令牌无效,请向其添加一个唯一的id,并跟踪您的服务-您需要手动构建类似的东西。

这个问题已经存在很久了(也得到了回答),但我只想插话

我的做法与您的(C)选项类似,但对承载访问令牌使用较短的到期时间,比如10或20分钟,这样,当您注销并删除客户端上的令牌时,尽管从技术上讲令牌仍然有效,但坏人将只有剩余的到期时间来使用您的有效令牌


实际上,我会将其与一个长寿命的刷新令牌一起使用,这样,如果新的承载令牌过期并希望继续与API资源交互,我就可以获得一个新的承载令牌,而无需再次进行身份验证。

我这里有一个漂亮的解决方案:。它是基于OWIN和标准ASP.NET标识(Microsoft.AspNet.Identity.EntityFramework)的Web API OAuth承载令牌授权的自定义用户会话实现。正如大多数人所期望的那样:

  • Web API会话在30分钟不活动后死亡
  • 在每次授权HTTP请求时,会话的寿命将延长30分钟
  • 注销工作正常:注销后,承载访问\u令牌无效(其被撤销)

GitHub上提供了完整的工作源代码:

是的,我们将这样做(见C),但事实上,承载令牌仍然有效。如果有人能在它被删除之前拦截它,他们仍然可以模拟用户。没问题。我非常感谢您花时间阅读:-)在承载令牌上设置一个较短的过期时间(如30分钟)并在刷新令牌上实现数据库验证策略怎么样?我认为这证实了我的想法。谢谢。代币需要这样做。在IdentityServer中,例如,每个客户端都有一个标志
IncludeJwtId
。那么身份验证的目的是什么。注销(DefaultAuthenticationTypes.ExternalBearner)@至少特权我正在使用Oauth连接到Quickbooks Online。它有自己的身份验证服务器和身份验证客户端。在连接和验证令牌之后,我正在使用signin方法设置owin athentication cookie。它设置了User.Identity并授权不允许匿名访问的控制器。但当QBO会话到期时,它在调用api时将关闭401。在这里,我捕获此异常并调用注销。但mvc用户身份仍然有效。在这种情况下该怎么办,因为删除访问令牌在我的情况下不起作用。@Duncan我想我不小心标记了答案。我已经删除了我的评论。很抱歉,谢谢你的更正。非常好的博客文章。感谢您的评论。如果您通过以下建议解决了问题,请添加您的代码。我真的有点困惑,你在哪里添加了唯一id和启用了IncludeJwtId