[英]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.