我正在开发 ASP.NET Core Minimal API,并且尝试使用身份承载方案通过 JWT 令牌进行身份验证。我遵循了一些教程来尝试实现这一目标,但是当尝试使用默认登录端点登录用户时,我总是遇到同样的错误:
未注册任何登录身份验证处理程序。您是否忘记调用 AddAuthentication().AddCookie("Identity.Bearer",...)?
我做了一些挖掘,我应该使用
BearerTokenExtensions.AddBearerToken
文件中的 program.cs
方法来配置我的应用程序中的身份验证。但是我不确定应该在什么情况下使用它以及应该提供什么参数。
这是我的完整
program.cs
文件。我不确定我到底需要做什么来解决这个问题
using Backend.Entities;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// Add Authentication with the Identity.Bearer (JWT) scheme
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});
builder.Services.AddAuthorization();
builder.Services.AddIdentityCore<User>()
.AddEntityFrameworkStores<ApplicationDBContext>()
.AddApiEndpoints();
var ConnString = builder.Configuration.GetConnectionString("WorkoutStore");
builder.Services.AddSqlite<ApplicationDBContext>(ConnString);
var app = builder.Build();
app.MapIdentityApi<User>(); // Map default endpoints for Identity with Bearer scheme
app.UseAuthentication();
app.UseAuthorization();
app.Run();
我的登录请求:
POST http://localhost:5178/login
Content-Type: application/json
{
"Email": "[email protected]",
"Password": "Anything@1!"
}
请使用
signInManager.CheckPasswordSignInAsync
代替signInManager.PasswordSignInAsync()
。
因为signInManager.PasswordSignInAsync()只能与cookie一起使用。这就是我们收到错误的原因。
当使用
IdentityCore
和 jwt
时,我们应该使用 signInManager.CheckPasswordSignInAsync
。