加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

oauth-2.0 – 在MVC6应用程序中的OAuth令牌到期

发布时间:2020-12-15 22:44:41 所属栏目:asp.Net 来源:网络整理
导读:所以我有一个包含身份服务器(使用ThinkTecture的IdentityServer3)和MVC6 Web服务应用程序的MVC6应用程序. 在Web服务应用程序中,我在启动时使用此代码: app.USEOAuthBearerAuthentication(options ={ options.Authority = "http://localhost:6418/identity";
所以我有一个包含身份服务器(使用ThinkTecture的IdentityServer3)和MVC6 Web服务应用程序的MVC6应用程序.

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

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

然后我有一个控制器,其操作具有Authorize属性.

我有一个使用身份服务器进行身份验证的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 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);
        }
    };
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读