我正在使用IdentityServer3并实现了自定义授权流程,以便与现有SSO实现向后兼容。我正在使用引用标记进行API身份验证。我已经实现了ITokenHandleStore和IUserService。
我能够成功登录并访问我的应用程序。问题是在我注销后,引用令牌仍然有效。
注销后,我调用HttpContext.Current.GetOwinContext()。Authentication.SignOut();我还调用/ connect / endsession?id_token_hint = mYrEfErEnCeToKeN并在查询字符串参数上传递用户的引用标记。
但是,IUserService中的SignOutAsync方法和ITokenHandleStore中的RemoveAsync方法都不会被调用。因此,令牌保留在我的令牌数据库表中,即使在用户注销后,也会在后续请求中被视为有效令牌。
在执行自定义授权流程时注销用户的正确方法是什么?如何从数据库令牌存储中删除记录?
当我调用endsession端点时,来自IdentityServer的日志记录显示:
Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:07:14.835 -04:00 [信息]结束访问令牌 验证请求Sam.Web.MicroServices.IdentityService.vshost.exe 信息:0:2016-07-13 04:09:22.289 -04:00 [信息]开始 结束会话请求Sam.Web.MicroServices.IdentityService.vshost.exe 信息:0:2016-07-13 04:09:22.349 -04:00 [信息]开始 结束会话请求验证 Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:09:22.412 -04:00 [信息]启动身份令牌 验证Sam.Web.MicroServices.IdentityService.vshost.exe错误:0: 2016-07-13 04:09:22.581 -04:00 [错误]格式错误的JWT令牌 System.ArgumentException:IDX10709:' jwtEncodedString'不太好 形成:' 7dc2417fb752d096af2870c46ca8a181'。字符串需要在 紧凑的JSON格式,其形式如下: ' ..&#39 ;.在 System.IdentityModel.Tokens.JwtSecurityToken..ctor(字符串 jwtEncodedString)in C:\工作空间\ WilsonForDotNet45Release \ SRC \ System.IdentityModel.To kens.Jwt \ JwtSecurityToken.cs:第68行 IdentityServer3.Core.Validation.TokenValidator.GetClientIdFromJwt(字符串 令牌) C:\本地\身份\服务器3 \核心\源\核心\验证\ TokenVa lidator.cs:第347行Sam.Web.MicroServices.IdentityService.vshost.exe 错误:0:2016-07-13 04:09:22.648 -04:00 [错误]没有clientId 提供,不能在身份标识中找到id。 Sam.Web.MicroServices.IdentityService.vshost.exe错误:0:2016-07-13 04:09:22.701 -04:00 [错误]"验证ID令牌提示时出错。" " {
\" SubjectId \":\" unknown \",\" Raw \":{ \" id_token_hint \":\" 7dc2417fb752d096af2870c46ca8a181 \" " Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:09:22.753 -04:00 [信息]重定向到注销 page Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:09:22.872 -04:00 [信息]提交注销端点 Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:09:22.944 -04:00 [信息]清除cookies Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:09:23.013 -04:00 [信息]渲染登出页面
当我调用/ revocation端点时,IdentityServer日志会显示:
Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:11:14.822 -04:00 [信息] CORS请求 路径:" / connect / r evocation"来自原产地: "铬 - 延伸:// fhbjgbiflinjbdggehcddcbncdddomop" Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:11:14.864 -04:00 [信息]已配置AllowedOrigins 和起源" c hrome-extension:// fhbjgbiflinjbdggehcddcbncdddomop"是 不允许使用Sam.Web.MicroServices.IdentityService.vshost.exe 信息:0:2016-07-13 04:11:14.906 -04:00 [信息]退出; origin" chrome-extension:// fhb jgbiflinjbdggehcddcbncdddomop"不是 允许Sam.Web.MicroServices.IdentityService.vshost.exe信息: 0:2016-07-13 04:11:14.941 -04:00 [信息] CorsPolicyService做到了 不允许来源Sam.Web.MicroServices.IdentityService.vshost.exe 信息:0:2016-07-13 04:11:15.005 -04:00 [信息]开始 令牌撤销请求2016-07-13 04:11:15.063 -04:00 [Debug]启动 客户端验证2016-07-13 04:11:15.064 -04:00 [Debug]开始解析 for X.509 certificate 2016-07-13 04:11:15.065 -04:00 [Debug] client_id 在帖子正文中找不到2016-07-13 04:11:15.066 -04:00 [调试]开始 在帖子正文中解析秘密2016-07-13 04:11:15.067 -04:00 [调试] 发帖体内没有秘密发现2016-07-13 04:11:15.068 -04:00 [调试] 开始解析基本身份验证密码 Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:11:15.069 -04:00 [信息] Parser没有发现任何秘密 Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:11:15.124 -04:00 [信息]未发现客户密码 Sam.Web.MicroServices.IdentityService.vshost.exe信息:0: 2016-07-13 04:11:15.175 -04:00 [信息]返回错误: invalid_client
答案 0 :(得分:1)
您在注销时收到错误的原因是您在id_token_hint
参数中传回了一个访问令牌。此参数需要在登录时发给您的身份令牌(假设您使用的是OpenID Connect)。
如果您只使用OAuth,那么endsession端点不适合您。要撤消访问令牌,您需要使用revocation endpoint。然后,这将从您的数据库中删除令牌。
您从吊销端点收到的错误似乎与其他问题有关(看起来您不是在提供客户端ID和密码)。