Asp.net mvc 默认标识与JWT冲突

Asp.net mvc 默认标识与JWT冲突,asp.net-mvc,asp.net-core,asp.net-web-api,jwt,identity,Asp.net Mvc,Asp.net Core,Asp.net Web Api,Jwt,Identity,我有一个ASP.NET Core 3.1网站,它在实际面向客户的网站上使用身份验证。它还有一个API后端,我想用JWT保护它,以便外部用户访问 但是,同时使用两个身份验证系统会导致问题。将默认身份验证方案设置为IdentityConstants.ApplicationScheme(或空)会通过身份验证方案路由API调用,导致JWT身份验证失败。同样,将schemes设置为JwtBearerDefaults.AuthenticationScheme会通过JWT方案路由调用,从而导致主站点失败 如何

我有一个ASP.NET Core 3.1网站,它在实际面向客户的网站上使用身份验证。它还有一个API后端,我想用JWT保护它,以便外部用户访问

但是,同时使用两个身份验证系统会导致问题。将默认身份验证方案设置为
IdentityConstants.ApplicationScheme
(或空)会通过身份验证方案路由API调用,导致JWT身份验证失败。同样,将schemes设置为
JwtBearerDefaults.AuthenticationScheme
会通过JWT方案路由调用,从而导致主站点失败

如何将两者分开,以便通过“/api”的任何路由都使用JWT方案,而所有其他调用都由默认标识方案处理?

以下是到目前为止的部分设置: startup.cs

public void ConfigureServices(IServiceCollection services)
{
...
   services.AddDefaultIdentity<IdentityUser>(options => { 

      options.SignIn.RequireConfirmedAccount = true;
      options.SignIn.RequireConfirmedEmail = false;

      options.Password.RequireDigit = true;
      options.Password.RequiredLength = 8;
      options.Password.RequireLowercase = true;
      options.Password.RequireUppercase = true;
      options.Password.RequireNonAlphanumeric = true;

      options.Lockout.MaxFailedAccessAttempts = 5;

      options.User.RequireUniqueEmail = true;
                
  }).AddEntityFrameworkStores<ApplicationDbContext>();

...

   services.AddAuthentication(x =>
   {
      // ** Playing with these settings **
      //x.DefaultScheme = IdentityConstants.ApplicationScheme;
      ////x.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
      ////x.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
      //x.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
      //x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
      //x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

  }).AddJwtBearer(x =>
  {                
      x.RequireHttpsMetadata = true;
      x.SaveToken = true;
      x.TokenValidationParameters = new TokenValidationParameters
      {
          ValidateIssuerSigningKey = false,
          IssuerSigningKey = new SymmetricSecurityKey(_SecretKey),
          ValidateIssuer = false,
          ValidateAudience = false,
          ValidateLifetime = true,
          ClockSkew = TimeSpan.Zero
      };
      x.IncludeErrorDetails = true;
  });
public void配置服务(IServiceCollection服务)
{
...
services.AddDefaultIdentity(选项=>{
options.SignIn.RequireConfirmedAccount=true;
options.SignIn.RequireConfirmedEmail=false;
options.Password.RequireDigit=true;
options.Password.RequiredLength=8;
options.Password.RequireLowercase=true;
options.Password.RequireUppercase=true;
options.Password.RequireNonAlphanumeric=true;
options.locket.MaxFailedAccessAttempts=5;
options.User.RequireUniqueEmail=true;
}).AddEntityFrameworkStores();
...
services.AddAuthentication(x=>
{
//**使用这些设置**
//x、 DefaultScheme=IdentityConstants.ApplicationScheme;
////x、 DefaultAuthenticateScheme=IdentityConstants.ApplicationScheme;
////x、 DefaultChallengeScheme=IdentityConstants.ApplicationScheme;
//x、 DefaultBankeScheme=JwtBearerDefaults.AuthenticationScheme;
//x、 DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
//x、 DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x=>
{                
x、 RequireHttpsMetadata=true;
x、 SaveToken=true;
x、 TokenValidationParameters=新的TokenValidationParameters
{
ValidateSuersigningKey=false,
IssuerSigningKey=新对称安全密钥(_SecretKey),
validateisuer=false,
ValidateAudience=false,
ValidateLifetime=true,
时钟偏移=时间跨度0
};
x、 IncludeErrorDetails=真;
});

任何想法都是非常受欢迎的。我不希望API函数使用明文许可证密钥。

这是否意味着您的web应用程序具有登录/退出功能,用户可以在登录后访问某些页面?同时,应用程序还具有一些以
/API
开头的端点,其他应用程序可以通过有效令牌?@Bemn这是正确的。它们都使用相同的底层服务,但使用不同的身份验证方法。我想我也面临着类似的情况。我正在开发一个新的MVC应用程序w/用户系统。另一方面,我必须为旧web应用程序提供一组API端点进行连接。结果证明,我遵循了创建身份的方法服务器应用程序。之后,我需要获取访问令牌。