了解 IdentityServer 和 API 通信

Understanding the IdentityServer and API communication

根据我的研究,最好将 API 和 IdentityServer 分成 2 个项目(也是 2 个域 - 即:https://api.mywebsite.com and https://identity.mywebsite.com),所以我这样做了。

在我的 IdentityServer/AuthenticationController.cs @ login-method 中,它目前正在制作一个 JWT 令牌,其中包含声明列表(角色、名称、Jti(idk 是什么)、电子邮件等,它放入 JwtSecurityToken。

我的 WebAPI/ProductController.cs 中的 [Authorize(Roles = "Admin")] 如何与我的 IdentityServer 通信然后授权它。是否在“AddAuthentication(...);”中在 Program.cs 服务中?或者在 AddJwtBearer(...) 中?或者具体在 ValidIssuer 中?

API(即https://api.mywebsite.com) and IdentityServer(https://identityserver.mywebsite.com)之间的联系在哪里?

我的 IdentityServer 项目 Program.cs:

...
builder.Services.AddIdentityServer().AddAspNetIdentity<IdentityUser>().AddClientStore<InMemoryClientStore>().AddResourceStore<InMemoryResourcesStore>();

builder.Services.AddAuthentication(auth =>
{
    auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuerSigningKey = true,
        
        ValidAudiences = builder.Configuration.GetSection("JWT:ValidAudiences").Get<string[]>(),
        ValidIssuer = builder.Configuration["JWT:ValidIssuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:Secret"]))
    };
}); 
...

我的API-项目Program.cs:

...
builder.Services.AddAuthentication(auth =>
{
    auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuerSigningKey = true,

        ValidAudiences = builder.Configuration.GetSection("JWT:ValidAudiences").Get<string[]>(),
        ValidIssuer = builder.Configuration["JWT:ValidIssuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:Secret"]))
    };
});
...

此外,关于 IdentityServer 和 API 身份验证和授权,我的两个代码块都写得很好吗?

API 中的 AddJwtBearer 负责获取传入的访问令牌并将其转换为“ClaimsPrincipal”用户。然后将该用户及其所有声明传递给授权处理程序,该处理程序将确定是否允许该用户通过。

例如,[Authorize(Roles = "Admin")] 属性将检查用户的角色声明是否包含 Admin 角色声明。

通常不需要在AddJwtBearer中指定IssuerSigningKey,而是让AddJwtBearer在启动时直接从IdentityServer中自动获取。 (只需删除 IssuerSigningKey)。如果 API 无法与 IdentityServer 通信,您通常会添加 IssuerSigningKey。