Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AspNet.Security.OpenIdConnect.Server(ASP.NET vNext)进行自定义生存期验证_Asp.net_Asp.net Core_Jwt_Openid Connect_Aspnet Contrib - Fatal编程技术网

使用AspNet.Security.OpenIdConnect.Server(ASP.NET vNext)进行自定义生存期验证

使用AspNet.Security.OpenIdConnect.Server(ASP.NET vNext)进行自定义生存期验证,asp.net,asp.net-core,jwt,openid-connect,aspnet-contrib,Asp.net,Asp.net Core,Jwt,Openid Connect,Aspnet Contrib,我正在使用Visual Studio 2015 Enterprise Update 1和ASP.NET vNext rc1-update1发布和使用所述的JWT令牌 在我们的实现中,我们希望控制令牌生存期验证 我们尝试了几种方法,所有这些方法都有不良副作用。例如,在一次尝试中,我们接管了Configure方法中的TokenValidationParameters.TokenValidationParameters.LifetimeValidator事件: app.UseJwtBearerAuth

我正在使用Visual Studio 2015 Enterprise Update 1和ASP.NET vNext rc1-update1发布和使用所述的JWT令牌

在我们的实现中,我们希望控制令牌生存期验证

我们尝试了几种方法,所有这些方法都有不良副作用。例如,在一次尝试中,我们接管了Configure方法中的TokenValidationParameters.TokenValidationParameters.LifetimeValidator事件:

app.UseJwtBearerAuthentication
(
选项=>
{
options.TokenValidationParameters=新的TokenValidationParameters()
{
LifetimeValidator=(DateTime?notBefore,DateTime?expires,SecurityToken SecurityToken,TokenValidationParameters validationParameters)=>
{
//假装做自定义验证
返回false;
}
};
}
);
该事件会导致验证失败,但客户端会收到一个500错误,而我们希望返回一个400系列错误和一个小负载

在另一次尝试中,我们尝试了TokenValidationParameters.Events的各种实现,例如检查ValidatedToken事件中的声明,但发现我们无法阻止中间件调用控制器操作,除非引发异常,从而使我们回到500错误问题

因此,我的问题是:

  • 使用OIDC进行生命周期验证的最佳实践是什么

  • 我们是否可以强制OIDC在令牌中不包含某些终身声明,如“nbf”,因为我们无论如何都不需要它们


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


这是一个好主意。可悲的是,它已经不起作用了

您唯一的选择是编写一个中间件来捕获异常,以防止服务器返回500响应。当然,这很难看,可能会隐藏重要的异常,但这是唯一已知的与RC1一起工作的解决方法

下面是一个示例(确保在JWT承载中间件之前注册它):


谢谢,@Pinpoint。您还可以告诉我,我们是否可以控制OIDC生成的令牌中包含哪些生存期声明?例如,我们可以删除“iat”、“nbf”等吗?您不能直接访问这些非用户声明,但有更好的方法来控制OIDC服务器颁发的令牌的生存期:最简单的方法是通过选项(通过更新
AccessTokenLifetime
/
IdentityTokenLifetime
/
刷新令牌生存期
)。另一个是通过
SerializeAccessToken
事件,您可以在其中更新与身份验证票证关联的
IssuedUtc
/
ExpiresUtc
属性(通过
context.AuthenticationTicket.properties
)。对于阅读这些评论的其他人,我们发现在上面的示例代码中捕获SecurityTokenInvalidLiveTimeException正好满足了我们的需要。为了避免访问令牌过期时出现500响应,捕获
SecurityTokenInvalidLiveTimeException
将起作用。但是,当访问令牌的格式错误或更改时,安全令牌处理程序还会引发其他类型的异常(如
invalidooperationexception
)。
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;
    }
});