[英]ASP.NET Core WebAPI Cookie + JWT Authentication
我們有一個帶有 API 后端(ASP.NET Core WebAPI)的 SPA(Angular):
SPA 在 app.mydomain.com/API 上偵聽app.mydomain.com
、 app.mydomain.com/API
我們使用 JWT 進行身份驗證,內置Microsoft.AspNetCore.Authentication.JwtBearer
; 我有一個創建令牌的 controller app.mydomain.com/API/auth/jwt/login
。 SPA 將它們保存到本地存儲中。 一切都很完美。 經過安全審核后,我們被告知要為 cookies 切換本地存儲。
問題是,app.mydomain.com/API 上的app.mydomain.com/API
被 SPA 使用,但也被移動應用程序和一些客戶服務器-2-服務器解決方案使用。
因此,我們必須保持 JWT 不變,但添加 Cookies。 我發現幾篇文章在不同的控制器上結合了 Cookies 和 JWT,但我需要它們在每個 controller 上並排工作。
如果客戶端發送 cookies,則通過 cookies 進行身份驗證。 如果客戶端發送 JWT 承載,則通過 JWT 進行身份驗證。
這是否可以通過內置的 ASP.NET 身份驗證或 DIY 中間件來實現?
謝謝!
我們有一個帶有API后端(ASP.NET Core WebAPI)的SPA(角度):
SPA正在app.mydomain.com
上偵聽app.mydomain.com/API
我們將JWT用於內置Microsoft.AspNetCore.Authentication.JwtBearer
身份驗證; 我有一個控制器app.mydomain.com/API/auth/jwt/login
,它創建令牌。 SPA將它們保存到本地存儲中。 所有作品都很完美。 經過安全審核后,我們被告知要為cookie切換本地存儲。
問題是SPA會使用app.mydomain.com/API
上的API,但移動應用程序和一些客戶的服務器2服務器解決方案也會使用該API。
因此,我們必須保持JWT不變,但要添加Cookies。 我發現了幾篇文章,它們結合了Cookie和JWT在不同的控制器上,但是我需要它們在每個控制器上並行工作。
如果客戶端發送cookie,則通過cookie進行身份驗證。 如果客戶端發送JWT承載,則通過JWT進行身份驗證。
是否可以通過內置的ASP.NET身份驗證或DIY中間件來實現?
謝謝!
我們有一個帶有API后端(ASP.NET Core WebAPI)的SPA(角度):
SPA正在app.mydomain.com
上偵聽app.mydomain.com/API
我們將JWT用於內置Microsoft.AspNetCore.Authentication.JwtBearer
身份驗證; 我有一個控制器app.mydomain.com/API/auth/jwt/login
,它創建令牌。 SPA將它們保存到本地存儲中。 所有作品都很完美。 經過安全審核后,我們被告知要為cookie切換本地存儲。
問題是SPA會使用app.mydomain.com/API
上的API,但移動應用程序和一些客戶的服務器2服務器解決方案也會使用該API。
因此,我們必須保持JWT不變,但要添加Cookies。 我發現了幾篇文章,它們結合了Cookie和JWT在不同的控制器上,但是我需要它們在每個控制器上並行工作。
如果客戶端發送cookie,則通過cookie進行身份驗證。 如果客戶端發送JWT承載,則通過JWT進行身份驗證。
是否可以通過內置的ASP.NET身份驗證或DIY中間件來實現?
謝謝!
我們有一個帶有API后端(ASP.NET Core WebAPI)的SPA(角度):
SPA正在app.mydomain.com
上偵聽app.mydomain.com/API
我們將JWT用於內置Microsoft.AspNetCore.Authentication.JwtBearer
身份驗證; 我有一個控制器app.mydomain.com/API/auth/jwt/login
,它創建令牌。 SPA將它們保存到本地存儲中。 所有作品都很完美。 經過安全審核后,我們被告知要為cookie切換本地存儲。
問題是SPA會使用app.mydomain.com/API
上的API,但移動應用程序和一些客戶的服務器2服務器解決方案也會使用該API。
因此,我們必須保持JWT不變,但要添加Cookies。 我發現了幾篇文章,它們結合了Cookie和JWT在不同的控制器上,但是我需要它們在每個控制器上並行工作。
如果客戶端發送cookie,則通過cookie進行身份驗證。 如果客戶端發送JWT承載,則通過JWT進行身份驗證。
是否可以通過內置的ASP.NET身份驗證或DIY中間件來實現?
謝謝!
我們有一個帶有API后端(ASP.NET Core WebAPI)的SPA(角度):
SPA正在app.mydomain.com
上偵聽app.mydomain.com/API
我們將JWT用於內置Microsoft.AspNetCore.Authentication.JwtBearer
身份驗證; 我有一個控制器app.mydomain.com/API/auth/jwt/login
,它創建令牌。 SPA將它們保存到本地存儲中。 所有作品都很完美。 經過安全審核后,我們被告知要為cookie切換本地存儲。
問題是SPA會使用app.mydomain.com/API
上的API,但移動應用程序和一些客戶的服務器2服務器解決方案也會使用該API。
因此,我們必須保持JWT不變,但要添加Cookies。 我發現了幾篇文章,它們結合了Cookie和JWT在不同的控制器上,但是我需要它們在每個控制器上並行工作。
如果客戶端發送cookie,則通過cookie進行身份驗證。 如果客戶端發送JWT承載,則通過JWT進行身份驗證。
是否可以通過內置的ASP.NET身份驗證或DIY中間件來實現?
謝謝!
我們有一個帶有API后端(ASP.NET Core WebAPI)的SPA(角度):
SPA正在app.mydomain.com
上偵聽app.mydomain.com/API
我們將JWT用於內置Microsoft.AspNetCore.Authentication.JwtBearer
身份驗證; 我有一個控制器app.mydomain.com/API/auth/jwt/login
,它創建令牌。 SPA將它們保存到本地存儲中。 所有作品都很完美。 經過安全審核后,我們被告知要為cookie切換本地存儲。
問題是SPA會使用app.mydomain.com/API
上的API,但移動應用程序和一些客戶的服務器2服務器解決方案也會使用該API。
因此,我們必須保持JWT不變,但要添加Cookies。 我發現了幾篇文章,它們結合了Cookie和JWT在不同的控制器上,但是我需要它們在每個控制器上並行工作。
如果客戶端發送cookie,則通過cookie進行身份驗證。 如果客戶端發送JWT承載,則通過JWT進行身份驗證。
是否可以通過內置的ASP.NET身份驗證或DIY中間件來實現?
謝謝!
使用此代碼,您可以同時使用 cookie 和 header。 如果 cookie 是 null 然后自動檢查 header。
在 AddJwtBearer 選項中添加此代碼。
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
context.Token = context.Request.Cookies["Authorization"];
return Task.CompletedTask;
}
};
完整用法是:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = Configuration["JwtToken:Audience"],
ValidIssuer = Configuration["JwtToken:Issuer"],
IssuerSigningKey =
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtToken:Key"]))
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
context.Token = context.Request.Cookies["Authorization"];
return Task.CompletedTask;
}
};
});
Header => 授權:Bearer Your-Token
或者
Cookie => Authorization=Your-Token //不要在Cookie中添加Bearer
我發現了 Rick Strahl 的這篇不錯的文章。 這是迄今為止我發現的最好的解決方案,我在 .NET 5 中使用它
這是在 .NET 應用程序中結合 JWT 令牌和 cookie 身份驗證的關鍵代碼:
services.AddAuthentication(options =>
{
options.DefaultScheme = "JWT_OR_COOKIE";
options.DefaultChallengeScheme = "JWT_OR_COOKIE";
})
.AddCookie( options =>
{
options.LoginPath = "/login";
options.ExpireTimeSpan = TimeSpan.FromDays(1);
})
.AddJwtBearer( options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = config.JwtToken.Issuer,
ValidateAudience = true,
ValidAudience = config.JwtToken.Audience,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.JwtToken.SigningKey))
};
})
.AddPolicyScheme("JWT_OR_COOKIE", "JWT_OR_COOKIE", options =>
{
options.ForwardDefaultSelector = context =>
{
string authorization = context.Request.Headers[HeaderNames.Authorization];
if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer "))
return JwtBearerDefaults.AuthenticationScheme;
return CookieAuthenticationDefaults.AuthenticationScheme;
};
});
我們有一個帶有API后端(ASP.NET Core WebAPI)的SPA(角度):
SPA正在app.mydomain.com
上偵聽app.mydomain.com/API
我們將JWT用於內置Microsoft.AspNetCore.Authentication.JwtBearer
身份驗證; 我有一個控制器app.mydomain.com/API/auth/jwt/login
,它創建令牌。 SPA將它們保存到本地存儲中。 所有作品都很完美。 經過安全審核后,我們被告知要為cookie切換本地存儲。
問題是SPA會使用app.mydomain.com/API
上的API,但移動應用程序和一些客戶的服務器2服務器解決方案也會使用該API。
因此,我們必須保持JWT不變,但要添加Cookies。 我發現了幾篇文章,它們結合了Cookie和JWT在不同的控制器上,但是我需要它們在每個控制器上並行工作。
如果客戶端發送cookie,則通過cookie進行身份驗證。 如果客戶端發送JWT承載,則通過JWT進行身份驗證。
是否可以通過內置的ASP.NET身份驗證或DIY中間件來實現?
謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.