gpt4 book ai didi

oauth-2.0 - MVC6 应用程序中的 OAuth token 过期

转载 作者:行者123 更新时间:2023-12-03 23:48:56 24 4
gpt4 key购买 nike

所以我有一个 MVC6 应用程序,其中包括一个身份服务器(使用 ThinkTecture 的 IdentityServer3)和一个 MVC6 Web 服务应用程序。

在 Web 服务应用程序中,我在 Startup 中使用此代码:

app.UseOAuthBearerAuthentication(options =>
{
options.Authority = "http://localhost:6418/identity";
options.AutomaticAuthentication = true;
options.Audience = "http://localhost:6418/identity/resources";
});

然后我有一个 Controller ,其 Action 具有 Authorize属性。

我有一个使用身份服务器进行身份验证的 JavaScript 应用程序,然后使用提供的 JWT token 访问 Web 服务操作。

这有效,我只能使用有效 token 访问该操作。

当 JWT 过期时,问题就来了。我得到的是一个冗长的 ASP.NET 500 错误页面,它返回以下异常的异常信息:

System.IdentityModel.Tokens.SecurityTokenExpiredException IDX10223: Lifetime validation failed. The token is expired.



我对 OAuth 和一般的 Web API 保护还很陌生,所以我可能有点偏离基础,但是 500 错误对我来说似乎不适用于过期的 token 。对于 Web 服务客户端来说,这绝对是不友好的。

这是预期的行为吗,如果不是,我需要做些什么来获得更合适的响应?

最佳答案

编辑:此错误已在 ASP.NET Core RC2 中修复,不再需要此答案中描述的解决方法。

注意:此解决方法不适用于 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);
}
};
});

关于oauth-2.0 - MVC6 应用程序中的 OAuth token 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com