toe*_*.uk 30 authentication asp.net-web-api owin asp.net-web-api2
我正在做一些研究工作,以便使用Bearer令牌作为身份验证机制(即AngularJS UI,通过Web API [2]项目中的OWIN进行身份验证).
我的登录工作正常,角色信息和一切都很好,但我无法获得登出令牌.
我的启动配置是这样的:
OAuthOptions = new OAuthAuthorizationServerOptions() {
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
AllowInsecureHttp = true
};
Run Code Online (Sandbox Code Playgroud)
我的退出操作就是这样:
public HttpResponseMessage Logout() {
var authentication = HttpContext.Current.GetOwinContext().Authentication;
authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);
return new HttpResponseMessage(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我已将所有身份验证内容留下,但确认我在设置令牌时使用的是ExternalBearer.
在我的UI中,我将令牌存储在本地存储中(此处不涉及cookie,这是一个深思熟虑的设计决策).所以我的UI上有一个注销按钮,注销了Logout操作,代码运行正常.
但是,如果我随后打了上需要授权的API的行动,请求仍然可以通过(即用户通过身份认证,即使他们去应该已经退出.
要么我错过了一些非常明显的东西(不会是第一次;-)或者还有更基本的东西 - 最后我正在打@leastprivilege因为我知道这是他们的区域.
我们将非常感激地提供任何帮助或见解.
我唯一能想到的是令牌在服务器/ API端是无状态的,因此无法过期或退出.
如果是这种情况,我想我可以:
a)添加一个刷新令牌,创建一个过去到期的新令牌 - 这甚至可以工作吗? - 实际取消它,它会发出一个新的令牌......旧的令牌仍然有效
b)将持有者令牌存储在数据库中并每次检查,在注销时删除令牌(自然盐渍,散列等).然而,这只是让我们回到拥有状态服务器.
c)当有人明确注销时,我可以(并且将会)从本地存储中删除令牌,但是如果baddy可以拦截令牌,则令牌在技术上仍然有效.当然,以上所有都将通过SSL,这应该会抑制坏人/女孩.
d)也许这就是为什么很多人将持有者令牌存储在cookie中(作为存储机制),所以一旦你注销,cookie将在下次刷新时删除.
对不起,以上是一个大脑转储,只是想抢先问任何问题
lea*_*ege 37
由于OAuth不是身份验证协议,因此没有注销的概念.删除客户端上的访问令牌 - 这就是您所能做的一切.
如果要在服务器端使令牌无效,请为其添加唯一ID并跟踪服务 - 您需要手动构建类似的内容.
Sve*_*kov 16
我在这里有一个漂亮的解决方案:http://www.nakov.com/blog/2014/12/22/webapi-owin-identity-custom-login-service/.它是基于OWIN和标准ASP.NET身份(Microsoft.AspNet.Identity.EntityFramework)的Web API OAuth承载令牌授权的自定义用户会话实现.它像大多数人所期望的那样工作:
GitHub提供完整的工作源代码:https://github.com/SoftUni/SPA-with-AngularJS/tree/master/Ads-REST-Services