Keycloak .net 5 api service



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

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

我的客户端id是api,所以认为这是应该存在的,但它想要JWT的Aud属性中的内容。在我的情况下;账户";。据我所知,它验证了jwt,如果我使apiName=";账户";但我甚至不需要客户的秘密,所以有些事情不起作用;对";。我只是不确定现在发生了什么。

这是代码:

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";
    });

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

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

如果您正在使用Key斗篷,那么您不应该使用AddIdentityServerAuthentication。该方法被明确配置为使用IdentityServer设置。但是您正在使用Key斗篷作为身份验证提供者,因此也不需要将IdentityServer添加到混合中。

相反,您应该直接使用JWT承载身份验证方案。类似这样的东西:

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承载身份验证,您的服务器已经接收到在应用程序外部检索到的令牌(在您的情况下,用户通过Keycloft的Angular客户端检索到该令牌(。因此,您不需要在服务器中输入与身份验证提供商的信任关系;您只需要验证一个令牌。为此,您既不需要客户端id,也不需要客户端机密。您只需要知道权限本身是什么,这样服务器就可以从中检索信息(如签名密钥(来验证令牌。

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