繁体   English   中英

MVC 和 JWT 中的身份 + 应用程序的 API 部分的身份

[英]Identity in MVC and JWT + Identity for API part of the application

我得到了 .NET 5 web 应用程序(MVC = Model 视图控制器),在这里我添加了带角色的 DefaultIdentity。 我向角色添加了一个用户,我在 controller 和特定角色的方法中创建了一个授权属性,它工作正常,这部分工作正常,例如 [Authorize(Roles = Admin)]

现在我添加了 API 控制器。 I want to use the same attributes on API controllers, but this time user would log to the system via API, and get the JWT, and that JWT contains a specific role, and this is not the problem it also works!

但问题是把这两者放在一起工作!

在向 ConfigureServices 方法添加逻辑后,我无法再访问 MVC 控制器,并且 API 正在工作。 我的意思是返回401,很明显我覆盖了规则,但我想保留两者,欢迎任何提示或解决方案!

services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; })
                .AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters
                    {
                        ClockSkew = TimeSpan.Zero,
                        ValidateIssuerSigningKey = true,
                        IssuerSigningKey = new SymmetricSecurityKey(key),
                        ValidateIssuer = true,
                        ValidIssuer = appSettings.Issuer,
                        ValidateAudience = true,
                        ValidAudience = appSettings.Issuer,
                        ValidateLifetime = true
                    };
                });

我有类似的问题,不记得到底是什么,但我确定它是在 startup.cs 中添加身份验证的顺序我设置如下:

app.UseHttpsRedirection();
app.UseRouting();
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();
app.UseCookiePolicy();
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddRoles<ApplicationRole>()
                .AddEntityFrameworkStores<IdentityContext>();

services.AddAuthentication()
              .AddCookie(cfg => cfg.SlidingExpiration = true)
              .AddJwtBearer(cfg =>
              {
                  cfg.RequireHttpsMetadata = false;
                  cfg.SaveToken = true;
                  cfg.TokenValidationParameters = new TokenValidationParameters()
                  {
                      ValidIssuer = Configuration["Tokens:Issuer"],
                      ValidAudience = Configuration["Tokens:Issuer"],
                      IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
                  };
              });
        

我认为您可以进行身份验证,但需要为您的启动服务和 api 控制器添加授权 在.Net Core 5(或者我使用的是 3.1)中,将类似这样的内容添加到您的启动服务中:

// can save "UserCredentials" as a public constant, to re-use in api
services.AddAuthorization(options =>
{
    options.AddPolicy("UserCredentials", policy =>
    {
        policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
        // add additional policies
    });
});

然后在您的 api controller 中,引用新的“UserCredentials”策略:

[HttpPost("Post")]
[Authorize(Policy = "UserCredentials")]
public async Task<ActionResult> Post()
{ 

}

在向 ConfigureServices 方法添加逻辑后,我无法再访问 MVC 控制器,并且 API 正在工作。

在您的代码中,我们可以发现您将JwtBearerDefaults.AuthenticationScheme配置为默认身份验证方案,这导致了问题。

为了使您的 MVC 和 API 都能正常工作,您可以尝试删除x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; AddAuthentication方法。 然后通过在 API 操作上应用[Authorize]属性来指定要使用的身份验证方案,如下所示。

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[HttpGet]
public IActionResult GetAll()
{

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM