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


先贴认证授权官方文档   https://docs.microsoft.com/zh-cn/aspnet/core/security 
认证:又叫身份验证,由用户提供凭据,然后将其与存储在操作系统、数据库、应用或资源中的凭据进行比较。 在授权过程中,如果凭据匹配,则用户身份验证成功,可执行已向其授权的操作。

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

在需要身份验证的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 源码

 

引用来源:https://www.cnblogs.com/zhanghm1/p/15818648.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:WPF 双向绑定到非公开 set 方法属性在 NET 45 和 NET Core 行为的不同
下一篇:.NET Core 自定义中间件 Middleware
评论列表

发表评论

评论内容
昵称:
关联文章

asp.net core 支持多种身份认证方式
Identity Server 4到今年年底就停止支持了,试一下使用Orchard Core 作为认证服务
【推荐】Razor文件编译 ASP.NET Core
ASP.NET Core 使用 LESS
asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelper
ASP.NET Core官网教程,资料查找
.NET 百万级 大数据插入、更新 ,支持多种数据库
.NET Core中的鉴权授权正确方式(.NET5)
ASP.NET Core开发者学习路线图
ASP.NET Core MVC中的路由约束
C# ASP.NET Core开发学生信息管理系统(三)
ASP.Net 微信H5 OAuth2 认证 (前后端不分离)
ASP.NET Core web API中使用Swagger/OpenAPI(Swashbuckle)
ASP.NET Core MVC 在过滤器ActionFilter中保存页面的生成的html静态页面文件
asp.net core 断点调试无法修改代码
ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action
Cannot resolve scoped service from root provider ASP.NET Core
C# ASP.NET Core开发学生信息管理系统(一)
asp.net core mvc修改cshtml试图热加载动态更新
ASP.NET Core 标记帮助程序(TagHelper)数据列表支持,循环数据

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码