在Web服务应用程序中,我在启动时使用此代码:
app.USEOAuthBearerAuthentication(options => { options.Authority = "http://localhost:6418/identity"; options.AutomaticAuthentication = true; options.Audience = "http://localhost:6418/identity/resources"; });
我有一个使用身份服务器进行身份验证的JavaScript应用程序,然后使用提供的JWT令牌来访问Web服务操作.
这是有效的,我只能使用有效的令牌访问该操作.
当JWT已经过期时,问题出现.我得到的是似乎是一个详细的ASP.NET 500错误页面,它返回以下异常的异常信息:
System.IdentityModel.Tokens.SecurityTokenExpiredException
IDX10223: Lifetime validation Failed. The token is expired.
对于OAuth而言,我非常新颖,并且保护了Web API,所以我可能会偏离基数,但是对于一个过期的令牌来说,一个500错误似乎不适合我.对于Web服务客户端绝对不友善.
这是预期的行为,如果不是,有什么需要做的,以获得更适当的回应?
解决方法
注意:此解决方法将无法在ASP.NET 5 RC1,due to this other bug上运行.您可以迁移到RC2夜间构建或创建自定义中间件,捕获JWT承载中间件抛出的异常并返回401响应:
app.Use(next => async context => { try { await next(context); } catch { // If the headers have already been sent,you can't replace the status code. // In this case,throw an exception to close the connection. if (context.Response.Hasstarted) { throw; } context.Response.StatusCode = 401; } });
可悲的是,这是JWT / OAuth2承载中间件(由MSFT管理)目前默认工作的方式,但最终应该是固定的.有关更多信息,请参阅此GitHub门票:https://github.com/aspnet/Security/issues/411
幸运的是,您可以通过使用AuthenticationFailed通知“轻松”解决此问题:
app.USEOAuthBearerAuthentication(options => { options.Notifications = new OAuthBearerAuthenticationNotifications { AuthenticationFailed = notification => { notification.HandleResponse(); return Task.Fromresult<object>(null); } }; });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。