簡體   English   中英

ASP.NET 核心 WebAPI Cookie + JWT 身份驗證

[英]ASP.NET Core WebAPI Cookie + JWT Authentication

我們有一個帶有 API 后端(ASP.NET Core WebAPI)的 SPA(Angular):

SPA 在 app.mydomain.com/API 上偵聽app.mydomain.comapp.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM