SecurityTokenInvalidSignatureException:IDX10500:签名验证失败。没有提供用于验证签名的安全密钥

时间:2019-04-08 10:37:44

标签: oidc

我正在使用FusionAuth(https://fusionauth.io)为我的应用设置OIDC。我在.NET核心应用程序中使用Microsoft.AspNetCore.Authentication.OpenIdConnect。在FusionAuth中进行身份验证后,它会将我重定向到我的应用程序上的/signin-oidc(服务提供商上的GET请求)。我是否在FusionAuth端缺少任何配置?

FusionAuth运行在:http://localhost:9011

我的应用:http://localhost:5000

我的应用重定向到FusionAuth进行登录:http://localhost:9011/oauth2/authorize?client_id=75e33455-f1c5-4e29-8863-53ec28364839&redirect_uri=http%3A%2F%2Flocalhost%3A5000%2Fsignin-oidc&response_type=code&scope=openid%20profile&response_mode=form_post&nonce=636903160481984640.YzMwZWI3ZTEtNzAxOS00MjFhLWIyNGMtYWY5ZGNkODlkY2VjYTNhYjdjMzEtYWMxYy00YThmLWJkYWItYmFiNWY2N2JjMDVk&state=CfDJ8NIq6JMx7khEv5e0kR0710VXenotl3FeHBvCCXUYDrzRVK6Kr7d36hcNMfABQ6pQYZuZQX71QtDFnVH7AczDgHW_8MDNMLFJfy5rF4xIJu2JTPVx3DH2fRp7FOo3ILoAfJfn4b-LnD7Q7zFBx8JO872BME5NXaS6NXiRlUiQQzcb44UNxS8Yn0yVgoQUJLV-iJXCuFlDwtN2z74c8aNhEYJbMiM9GyqiprpqI3p_WocjAyvSAxc7dddkHo7uxD-pBkrldI_v8Z-kVsTwCyBCfCBpKKOIFYvLBfpBcoVjqcSYHfI9GybutW9P4MxeWc2wtykOdBiqcF18ZCN-2yqLSWE&x-client-SKU=ID_NET&x-client-ver=2.1.4.0

登录后重定向到:http://localhost:5000/signin-oidc?code=vctVvqZo9zBMHrG9TkY5PZxjW1eqVgTCWnyHY55k3cg&state=CfDJ8NIq6JMx7khEv5e0kR0710VXenotl3FeHBvCCXUYDrzRVK6Kr7d36hcNMfABQ6pQYZuZQX71QtDFnVH7AczDgHW_8MDNMLFJfy5rF4xIJu2JTPVx3DH2fRp7FOo3ILoAfJfn4b-LnD7Q7zFBx8JO872BME5NXaS6NXiRlUiQQzcb44UNxS8Yn0yVgoQUJLV-iJXCuFlDwtN2z74c8aNhEYJbMiM9GyqiprpqI3p_WocjAyvSAxc7dddkHo7uxD-pBkrldI_v8Z-kVsTwCyBCfCBpKKOIFYvLBfpBcoVjqcSYHfI9GybutW9P4MxeWc2wtykOdBiqcF18ZCN-2yqLSWE&userState=Authenticated

我希望我登录到http://localhost:5000,但是却出现以下错误。

SecurityTokenInvalidSignatureException: IDX10500: Signature validation failed. No security keys were provided to validate the signature.

2 个答案:

答案 0 :(得分:0)

该库似乎需要公共密钥才能验证FusionAuth从token端点返回的JWT是否有效。我不是DotNet专家,但是通过一些搜索,OpenIdConnectOptions对象是为OIDC配置所有内容的地方。有一个名为SecurityTokenValidator的属性,您可以向其中添加密钥,这可能是最好的起点。

另一种解决方案是告诉ASP.net Core OIDC库使用userinfo API而不是存储在id_token中的JWT。这将导致DotNet回调到FusionAuth的userinfo API,然后FusionAuth将为您处理所有验证,并以JWT的OIDC声明作为响应。 GetClaimsFromUserInfoEndpoint对象上的属性OpenIdConnectOptions看起来像启用了它。但是,我不知道如何告诉DotNet userinfo API的URL。这是该配置的示例:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)  
{

    app.UseStaticFiles();

    app.UseIdentity();

    app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
        {
            ClientId = Configuration["ClientId"],
            ClientSecret = Configuration["ClientSecret"],
            Authority = Configuration["Authority"],
            ResponseType = OpenIdConnectResponseType.Code,
            GetClaimsFromUserInfoEndpoint = true
        });

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

我从此博客文章中获得了该代码:

https://andrewlock.net/an-introduction-to-openid-connect-in-asp-net-core/

您可能需要对DotNet OIDC集成进行一些额外的搜索和阅读,才能使所有这些正常工作。那里没有很多信息,但是一些人写了关于这个主题的博客可能会有所帮助。

答案 1 :(得分:0)

最后找到了解决方法

services.AddOpenIdConnect(options => {
    ...
    options.TokenValidationParameters.IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.ASCII.GetBytes("lOB8KJK2gKn2c6ZFJIKpVqLM-gHa6WmFvSJfHWUKscs"));
    ...
}

我错过了从FusionAuth向应用程序添加密钥的过程,该密钥用于验证令牌。