根據我的研究,最好將 API 和 IdentityServer 分成 2 個專案(也是 2 個域 - 即:https://api.mywebsite.com和https://identity.mywebsite.com),所以我做到了那。
在我的 IdentityServer/AuthenticationController.cs @ login-method 中,它當前正在制作一個 JWT 令牌,其中包含宣告(角色、名稱、Jti(idk 那是什么)、電子郵件等串列,它放入 JwtSecurityToken .
我的 WebAPI/ProductController.cs 中的 ie [Authorize(Roles = "Admin")] 如何與我的 IdentityServer 通信,然后對其進行授權。是否在“AddAuthentication(...);”中 在 Program.cs 服務中?還是在 AddJwtBearer(...) 中?或者特別是在ValidIssuer中?
API(即https://api.mywebsite.com)和 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 身份驗證和授權方面,我的兩個代碼塊都寫得好嗎?
uj5u.com熱心網友回復:
API 中的 AddJwtBearer 負責獲取傳入的訪問令牌并將其轉換為“ClaimsPrincipal”用戶。然后將該用戶及其所有宣告傳遞給授權處理程式,該處理程式將確定是否允許該用戶通過。
例如,[Authorize(Roles = "Admin")] 屬性將檢查用戶中的角色宣告是否包含管理員角色宣告。
通常您不需要在 AddJwtBearer 中指定 IssuerSigningKey,而是讓 AddJwtBearer 在啟動時直接從 IdentityServer 自動檢索它。(只需洗掉 IssuerSigningKey)。如果 API 無法與 IdentityServer 對話,您通常會添加 IssuerSigningKey。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437614.html
