龙空技术网

asp.net core 支持多种身份认证方式

中年农码工 584

前言:

此刻咱们对“aspnetjs验证”大致比较关心,朋友们都需要学习一些“aspnetjs验证”的相关知识。那么小编也在网络上收集了一些对于“aspnetjs验证””的相关文章,希望你们能喜欢,大家快快来学习一下吧!

先贴认证授权官方文档

认证:又叫身份验证,由用户提供凭据,然后将其与存储在操作系统、数据库、应用或资源中的凭据进行比较。 在授权过程中,如果凭据匹配,则用户身份验证成功,可执行已向其授权的操作。

授权:判断允许用户执行的操作的过程。

在需要身份验证的web服务中,经常存在一个网站需要满足多种身份验证的需求,asp.net core 框架提供的认证授权功能已经支持这种操作;

日常可能有两种情况:

  1. 不同的认证token 访问的接口不同,比如后台管理的接口和前台用户的接口放在一个web 项目中,分别提供不同的路由;

  2. 不同的认证token 访问的接口相同,比如前台用户认证有多种认证方式,都能访问相同路由;

准备基础代码:

这里用两个JWT认证模拟两个不同的认证方案 AuthSettings.AdminScheme 、 AuthSettings.UserScheme

builder.Services.AddAuthentication(AuthSettings.AdminScheme)    .AddJwtBearer(AuthSettings.AdminScheme, options =>    {        options.TokenValidationParameters = new TokenValidationParameters        {            ValidateIssuer = false,            ValidateAudience = false,            ValidateLifetime = false,            ValidateIssuerSigningKey = true,            ValidIssuer = AuthSettings.AdminIssuer,            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.AdminSecret))        };    })    .AddJwtBearer(AuthSettings.UserScheme, options =>    {        options.TokenValidationParameters = new TokenValidationParameters        {            ValidateIssuer = false,            ValidateAudience = false,            ValidateLifetime = false,            ValidateIssuerSigningKey = true,            ValidIssuer = AuthSettings.UserIssuer,            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.UserSecret))        };    });

app.UseAuthentication();

app.UseAuthorization();

app.MapControllers();

1. 不同的认证token 访问的接口不同

对于情况1,我们一般直接在 options.ForwardDefaultSelector 写上获取认证方案的逻辑就能实现动态切换认证方案,你可以根据路由地址,header 参数等自定义你想要执行的认证方案

builder.Services.AddAuthentication(AuthSettings.AdminScheme)    .AddJwtBearer(AuthSettings.AdminScheme, options =>    {//动态转发方案        options.ForwardDefaultSelector = content =>        {            return content.Request.Path.Value!.Contains(AuthSettings.UserUrlBase) ? AuthSettings.UserScheme : null;        };        options.TokenValidationParameters = new TokenValidationParameters        {            ValidateIssuer = false,            ValidateAudience = false,            ValidateLifetime = false,            ValidateIssuerSigningKey = true,            ValidIssuer = AuthSettings.AdminIssuer,            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.AdminSecret))        };    })    .AddJwtBearer(AuthSettings.UserScheme, options =>    {        options.TokenValidationParameters = new TokenValidationParameters        {            ValidateIssuer = false,            ValidateAudience = false,            ValidateLifetime = false,            ValidateIssuerSigningKey = true,            ValidIssuer = AuthSettings.UserIssuer,            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.UserSecret))        };    });

当然,如果你不想这样操作,也有针对接口的操作,你只需要在接口处申明你要执行的认证方案就行

        [HttpGet("test4")]        [Authorize(AuthenticationSchemes = AuthSettings.UserScheme)]        public async Task<IActionResult> Test4()        {            return new JsonResult(new { Code = "OK" }) { StatusCode = (int)HttpStatusCode.OK };        }

当然也有针对授权策略的认证方案制定

builder.Services.AddAuthorization(options => {    options.AddPolicy("ClaimNamePolicy", options => {        options.AuthenticationSchemes = new[] { AuthSettings.UserScheme };        options.RequireClaim("ClaimName", "test2");    });});

[HttpGet("test3")]

[Authorize("ClaimNamePolicy")]

public async Task<IActionResult> Test3()

{

return new JsonResult(new { Code = "OK" }) { StatusCode = (int)HttpStatusCode.OK };

}

以上三种方式都可以指定你想要的认证方案;

2. 不同的认证token 访问的接口相同

对于不同的认证token 访问相同接口,我们一般直接重新配置默认的授权策略,指定多个方案即可

builder.Services.AddAuthorization(options => {    options.DefaultPolicy = new AuthorizationPolicyBuilder()    .RequireAuthenticatedUser()    .AddAuthenticationSchemes(new string[] { AuthSettings.UserScheme, AuthSettings.AdminScheme })    .Build();});

使用比较简单,但是里面有很多框架的逻辑需要理解,想要深入研究的话,建议去看看 asp.net core 源码

标签: #aspnetjs验证