我正在使用FusionAuth(https://fusionauth.io)为我的应用设置OIDC。我在.NET核心应用程序中使用Microsoft.AspNetCore.Authentication.OpenIdConnect
。在FusionAuth中进行身份验证后,它会将我重定向到我的应用程序上的/signin-oidc
(服务提供商上的GET
请求)。我是否在FusionAuth端缺少任何配置?
FusionAuth运行在:http://localhost:9011
我希望我登录到http://localhost:5000,但是却出现以下错误。
SecurityTokenInvalidSignatureException: IDX10500: Signature validation failed. No security keys were provided to validate the signature.
答案 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向应用程序添加密钥的过程,该密钥用于验证令牌。