.netcore 自定义多种身份验证方法混用
背景:
公司项目有很多租户,每个租户的系统都可能调用我们的租户服务,原来的解决方案是为每个租户提供一个service。随着租户的增多,service也多了起来,但是每个service里的逻辑都是一样的:验证身份,获取body,调用下游服务。
重构:
现在对外统一提供一个TenantService,里面只有一个Dispatcher方法。现在怎么知道进来的是哪个租户呢,这个租户要调用什么下游服务呢?这里我们用了一个最简单的方法,在Header添加了一个accesskey,我们为每个租户方法提供一个唯一的key,这个key在数据库中存放了对应的租户名,服务名,方法名,身份验证模式等。
本文重点:
本文主要针对不同的租户进来,可能采取不同的身份验证,比如,一个是Basic,另一个又是JWT等等。
首先定义一个特性:CommonAuthenticationAttribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CommonAuthenticationAttribute : Attribute, IAuthorizationFilter
{
/// <summary>
/// 1、从数据库中获取相应的租户名,服务名,方法名和身份验证模式
/// 2、将租户名,服务名,方法名添加到请求的header中
/// 3、调用相应的身份验证方法,失败则返回
/// </summary>
/// <param name="context"></param>
public void OnAuthorization(AuthorizationFilterContext context)
{
var accessKey = GetHeaderValue(context, ConstantVar.AccessKey);
//从数据库中获取相应的租户名,服务名,方法名和身份验证模式
var routeData = GetRouteData(accessKey);
//不合法的accesskey
if (routeData == null)
{
var errorMsg = $"Invalidate {ConstantVar.AccessKey} value";
context.Result = new ObjectResult(errorMsg) { StatusCode = 401 };
}
else
{
string authType = routeData.authType;
if (!string.IsNullOrWhiteSpace(authType))
{
//重点:数据库中的authType的值一定要为已经实现的验证模式名字,
var res = context.HttpContext.AuthenticateAsync(authType).Result;
if (!res.Succeeded)//身份验证失败
{
context.Result = new ObjectResult(res.Failure.Message) { StatusCode = 401 };
}
}
}
}
}
以实现Basic验证为例,指定上面代码里的authType
public class BasicAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{ public BasicAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock) : base(options, logger, encoder, clock)
{
} /// <summary>
/// 验证用户名与密码
/// </summary>
/// <returns></returns>
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// 跳过有匿名访问标签 [AllowAnonymous]
var endpoint = Context.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
return AuthenticateResult.NoResult(); if (!Request.Headers.ContainsKey("Authorization"))
return AuthenticateResult.Fail("Missing Authorization Header"); try
{
var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
var credentialBytes = Convert.FromBase64String(authHeader.Parameter);
var credentials = Encoding.UTF8.GetString(credentialBytes).Split(new[] { ':' }, 2);
var username = credentials[0];
var password = credentials[1];
var res = await Authenticate(username, password);//验证用户名密码
if (res)
{
var claims = new[]
{
new Claim(ClaimTypes.Name, username),
};
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, Scheme.Name); return AuthenticateResult.Success(ticket);
}
else
{
return AuthenticateResult.Fail("Unauthorized");
}
}
catch
{
return AuthenticateResult.Fail("Invalid Authorization Header");
} } }
重点来了,在ConfigureServices里添加身份验证的模式。这里的“BasicAuth”就上面的authType
services.AddAuthentication()
.AddScheme<AuthenticationSchemeOptions, BasicAuthHandler>("BasicAuth", null);//指定身份验证模式名,这里还可以添加多种验证模式
至此,改造任务就基本完成了。然后只需要在Dispatcher方法上加上[CommonAuthentication]。
以后其它租户进入,只需要提供给它一个唯一accesskey就可以了,如果有不同的身份验证方法,添加必要的验证模式就可以了。
.netcore 自定义多种身份验证方法混用的更多相关文章
- asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权
开发了一个公司内部系统,使用asp.net core 3.1.在开发用户认证授权使用的是简单的cookie认证方式,然后开发好了要写几个接口给其它系统调用数据.并且只是几个简单的接口不准备再重新部署一 ...
- .netcore实现jwt身份验证
前言 http协议本身是一种无状态的协议.所以客户端的每次请求,服务端是不清楚其身份的,需要客户端每次都要将身份信息传入,服务进行验证,才能达到安全验证的目的. 传统的Web用户验证:1.客户端传入用 ...
- 基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...
- Windows系统HTTP身份验证方法
当Windows客户端尝试使用HTTP协议访问基于Web的资源时,会在客户端和服务器之间建立"对话".换句话说,服务器告诉客户端,访问资源之前进行身份验证 ,并且服务器还告诉客户端 ...
- ASP.NET中WebService的两种身份验证方法
一.通过SOAP Header身份验证 此方法是通过设置SOAP Header信息来验证身份,主要通过以下几步: 1.在服务端实现一个SOAP Header类 public class Credent ...
- jQuery.validator.addMethod自定义验证方法
在开发中用到了jQuery的validate控件,有时需要自定义验证方法.我们可以通过jQuery.validator.addMethod()来实现,下面是例子: <!DOCTYPE html ...
- [转]Reporting Services 中的身份验证类型
本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281310%28v%3dsql.100%2 ...
- asp.net core 3.x 身份验证-1涉及到的概念
前言 从本篇开始将围绕asp.net core身份验证写个小系列,希望你看完本系列后,脑子里对asp.net core的身份验证原理有个大致印象.至于身份验证是啥?与授权有啥联系?就不介绍了,太啰嗦. ...
- 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇
在这个WEB API横行的时代,讲WEB Service技术却实显得有些过时了,过时的技术并不代表无用武之地,有些地方也还是可以继续用他的,我之所以会讲解WEB Service,源于我最近面试时被问到 ...
随机推荐
- 提升GAN的技术 Tips for Improving GAN
Wasserstein GAN (WGAN) 在一些情况下,用 JS散度来衡量两个分布的远近并不适合: 1. 数据是高维空间中的低维流形(manifold),两个分布在高维空间中的 overlap 少 ...
- kubernetes下jenkins实战maven项目编译构建
关于kubernetes环境的jenkins集群 在kubernetes环境部署的jenkins集群,执行任务时会新建pod,任务完成后pod被销毁,架构如下所示: 在kubernetes搭建jenk ...
- Inno Setup 5打包exe遇到的坑,做一个学习记录
; 脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "人员管理系统"#de ...
- fio硬盘测速windows+linux
一.FIO工具简介 Fio工具的介绍网上有很多,都是可以通用的,这里就不做太多个人描述了,直接借鉴一下 fio是一种I / O工具,用于基准测试和压力/硬件验证.它支持19种不同类型的I / O引擎( ...
- 虚拟主机和ECS的选择——有的坑你可以不躺,有的钱你可以不花(一)
一直想做网站,由于最开始虚拟主机有优惠,所以三年前买了虚拟主机,后来一直续费,间歇性使用过,发现很多功能都不行. 昨天准备买新的,然后想起学生购买有优惠,于是开始了学生认证之旅. 首先,看一下之前 ...
- Node.js安装及环境配置 for winer
Node.js安装及环境for Windows 一.安装环境 1.本机系统:Windows 10 Pro(64位) 2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1.下 ...
- Anaconda安装和使用 akshare获取股票数据
介绍 Anaconda是开源的Python包管理器.既是Python各种库的大礼包集合,特别是数据分析和科学计算方面的库都预装了,也是一个能创建虚拟机环境的工具. 我为什么安装 我安装它的原因不是科学 ...
- day39 Pyhton 并发编程02
一.内容回顾 并发和并行的区别 并发 宏观上是在同时运行的 微观上是一个一个顺序执行 同一时刻只有一个cpu在工作 并行 微观上就是同时执行的 同一时刻不止有一个cpu在工作 什么是进程 一个运行中的 ...
- day19 Pyhton学习 递归函数
# 函数的递归 : 在一个函数的内部调用它自己 # import sys # sys.setrecursionlimit(1000000) # 设置递归的最大深度 # 总结 # 1.递归函数的定义 : ...
- pytest文档52-命令行参数--setup-show查看fixture的执行过程
前言 使用命令行运行 pytest 用例的时候,看不到 fixture 的执行过程. 如果我们想知道fixture的执行过程和先后顺序,可以加上 --setup-show 命令行参数,帮助查看 fix ...