我正在使用FusionAuth(https://fusionauth.io)为我的应用程序设置OIDC。我在我的.NET核心应用程序中使用Microsoft.AspNetCore.Authentication.OpenIdConnect
。在FusionAuth中进行身份验证后,它会将我的应用程序重定向到/signin-oidc
(服务提供商处的GET
请求)。我错过了FusionAuth方面的任何配置吗?
运行于:http://localhost:9011的FusionAuth
我的应用程序:http://localhost:5000
我希望我登录http://localhost:5000,但我得到了跟随错误。
SecurityTokenInvalidSignatureException: IDX10500: Signature validation failed. No security keys were provided to validate the signature.
看起来这个库需要一个公钥才能验证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集成以使其全部正常工作。那里没有太多的信息,但是有些人写了关于这个主题的博客可能有所帮助。
终于得到了解决方案
services.AddOpenIdConnect(options => {
...
options.TokenValidationParameters.IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.ASCII.GetBytes("lOB8KJK2gKn2c6ZFJIKpVqLM-gHa6WmFvSJfHWUKscs"));
...
}
我错过了将FusionAuth中的密钥添加到我的应用程序中,该应用程序用于验证令牌。