了解 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。
根据我的研究,最好将 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。