微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keycloak .net 5 api 服务

如何解决Keycloak .net 5 api 服务

我一直在尝试让 Keycloak 使用以下设置:

  • 角度前端
    • 我能够让它正常工作,它会出现 keycloak 登录屏幕,登录后,我可以看到令牌并将其传递给我的 api。
  • ASP .NET 5 服务
    • 这是一个简单的 api,它应该验证不记名令牌并返回控制器中的值。这是让我适应的部分。

我的客户端 ID 是 api,所以我认为那是应该存在的,但它想要 JWT 的 Aud 属性中的内容。就我而言,它是“帐户”。据我所知,如果我使 apiName = "account" ,它会验证 jwt 并工作,但我什至不需要客户端机密,所以有些东西“不正确”。我只是不确定现在发生了什么。

代码如下:

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
    .AddIdentityServerAuthentication(options =>
    {
        //base - address of your identityserver

        options.Authority = Configuration["Authentication:KeycloakAuthentication:ServerAddress"] + "/auth/realms/" + Configuration["Authentication:KeycloakAuthentication:Realm"];

        //name of the API resource

        options.ApiName = "account";
        options.ApiSecret = Configuration["Authentication:KeycloakAuthentication:ClientSecret"];
        options.EnableCaching = true;
        options.RequireHttpsMetadata = false;

        })
    .AddCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
        options.Cookie.Name = "api.cookie";
    });

另外,我在 Configure 方法中有这个:

app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
});

解决方法

如果您使用的是 Keycloak,则不应使用 AddIdentityServerAuthentication。该方法明确配置为与 IdentityServer 设置一起使用。但是您使用 Keycloak 作为身份验证提供程序,因此无需将 IdentityServer 添加到组合中。

相反,您应该直接使用 JWT Bearer 身份验证方案。像这样:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = Configuration["Authentication:KeycloakAuthentication:ServerAddress"] + "/auth/realms/" + Configuration["Authentication:KeycloakAuthentication:Realm"],options.Audience = "account",options.RequireHttpsMetadata = false;
    });

使用 JWT 不记名身份验证,您的服务器已经收到一个在您的应用程序外部检索到的令牌(在您的情况下,用户通过 Keycloak 的 Angular 客户端检索到它)。所以你不需要在你的服务器中与认证提供者建立信任关系;您只需要验证一个令牌。为此,您既不需要客户端 ID,也不需要客户端机密。您只需要知道授权本身是什么,这样服务器就可以从中检索信息(如签名密钥)以验证令牌。

根据您的 Keycloak 设置,您可能还想配置 TokenValidationParameters,以便您可以向令牌添加进一步检查。但除此之外,你不需要做任何其他事情。由于您使用的是无状态承载身份验证,因此您也不需要配置 cookie 身份验证方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。