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

问题描述 投票:0回答:2

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

运行于:http://localhost:9011的FusionAuth

我的应用程序: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.

oidc
2个回答
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集成以使其全部正常工作。那里没有太多的信息,但是有些人写了关于这个主题的博客可能有所帮助。


0
投票

终于得到了解决方案

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

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

© www.soinside.com 2019 - 2024. All rights reserved.