gpt4 book ai didi

c# - ASP.NET Core WebAPI Cookie + JWT 认证

转载 作者:太空狗 更新时间:2023-10-29 23:12:26 25 4
gpt4 key购买 nike

我们有一个带有 API 后端(ASP.NET Core WebAPI)的 SPA(Angular):

SPA 监听 app.mydomain.com,API 监听 app.mydomain.com/API

我们使用内置 Microsoft.AspNetCore.Authentication.JwtBearer 的 JWT 进行身份验证;我有一个创建 token 的 Controller app.mydomain.com/API/auth/jwt/login。 SPA 将它们保存到本地存储中。一切都很完美。经过安全审核后,我们被告知要为 cookie 切换本地存储。

问题是,app.mydomain.com/API 上的 API 被 SPA 使用,但也被一个移动应用程序和几个客户服务器-2-服务器解决方案使用。

因此,我们必须保持 JWT 不变,但添加 Cookies。我发现几篇文章在不同的 Controller 上结合了 Cookies 和 JWT,但我需要它们在每个 Controller 上并排工作。

如果客户端发送 cookie,则通过 cookie 进行身份验证。如果客户端发送 JWT 承载,则通过 JWT 进行身份验证。

这是否可以通过内置的 ASP.NET 身份验证或 DIY 中间件实现?

谢谢!

最佳答案

好吧,我已经尝试实现这一目标一段时间了,并且我通过以下代码解决了使用 jwt 身份验证 token 和 Cookie 身份验证的相同问题。

API 服务提供者UserController.cs

This Provide Different Services to the User with Both (Cookie and JWT Bearer)Authentication Schemes

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
[Route("[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private readonly IUserServices_Api _services;
public UsersController(IUserServices_Api services)
{
this._services = services;
}

[HttpGet]
public IEnumerable<User> Getall()
{
return _services.GetAll();
}
}

我的Startup.cs

public void ConfigureServices(IServiceCollection services)
{

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

services.AddAuthentication(options => {
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Home/Error";
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = " you site link blah blah",
ValidIssuer = "You Site link Blah blah",
IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(sysController.GetSecurityKey()))
,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});

}

如果你想为特定的 Controller 自定义身份验证那么您必须为授权指定身份验证类型喜欢:

[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
public IActionResult Index()
{
return View(); // This can only be Access when Cookie Authentication is Authorized.
}

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public IActionResult Index()
{
return View(); // And this one will be Access when JWT Bearer is Valid
}

关于c# - ASP.NET Core WebAPI Cookie + JWT 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com