前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微系列:1、Ocelot 增加自定义Header到下游

微系列:1、Ocelot 增加自定义Header到下游

作者头像
老张的哲学
发布2023-01-09 18:51:44
7290
发布2023-01-09 18:51:44
举报
文章被收录于专栏:NetCore 从壹开始

一般来说,通过Ocelot网关向下游转发的时候,会自定义一下Header,并且这些Header是动态的数据, 所以总体思路是从httpcontext中获取token,然后对其进行解析(可连库丰富数据),并将Claim声明添加到请求中,下放到下游微服务。

一、配置ocelot.json

1、增加AddHeadersToRequest节点

代码语言:javascript
复制
"AddHeadersToRequest": {
  "x-userid": "Claims[userid] > value",
  "x-username": "Claims[username] > value",
}

此外还有AddClaimsToRequest、AddQueriesToRequest。

Ocelot允许用户访问Claims并把它们转换到头部,请求字符串参数和其他Claims中。这仅在用户通过身份验证后才可用。用户通过身份验证之后,我们运行Claims转换中间件。这个中间件允许在授权中间件调用之前转换Claims。

当用户身份验证之后,首先会调用Claims转换到头的中间件,最后调用Claims转换到查询字符串的中间件。

2、增加AuthenticationOptions节点

如果需要用到Claims,需要用户授权以后,需要授权动作,那 AuthenticationOptions 就是是配置授权的。

如果有会根据配置的认证方案进行身份认证。如果没有则不进行身份认证。

AuthenticationProviderKey 是刚才注册的认证方案。

AllowedScopes 是 AllowedScopes中配置的授权访问范围。

代码语言:javascript
复制
"AuthenticationOptions": {
  "AuthenticationProviderKey": "anson",
  "AllowedScopes": [ "" ]
}

二、服务注册

主要包括认证和授权两个部分, 认证是对前端请求中token的校验过程,思路相对单一且简单,可以自定义控制鉴权的力度。

授权是对下游服务的加权,也起到了把认证中将token转化而来的Claims给下放到下游的作用。

1、认证服务

代码语言:javascript
复制
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddScheme<DemoAuthenticationOptions, DemoAuthenticationHandler>("anson", o => { });

关于认证处理器,大致思路如下(伪代码):

代码语言:javascript
复制
public class DemoAuthenticationHandler : AuthenticationHandler<DemoAuthenticationOptions>
 {
     protected override async Task<AuthentResult> HandleAuthenticateAsync()
     {
         var token = string.Empty;
         token = GetTokenStringFromHeader();
         if (isExpiredToken(token))
         {
             return AuthentResult.Fail("认证失败,令牌已失效");
         }

         var usersInfo = getUsersInfo(token);
         var claimsHeader = new List<Claim>()
         {
             new Claim("userid", usersInfo.UsersId.ToString()),
             new Claim("username", HttpUtility.UrlEncode(usersInfo.CnName)),
             new Claim("anson", "anson")
         };

         var userInfo = new UserInfo(usersInfo.UsersId, usersInfo.CnName, users.WXHeadImg, users.DomainAccount, users.UsersNumber.ToString());
         var principalHeader = new UserPrincipal(new ClaimsIdentity(claimsHeader, Scheme.Name), userInfo, token);
         var ticket = new AuthenticationTicket(principalHeader, Scheme.Name);
         return AuthentResult.Success(ticket);
     }
 }

还需要授权服务 正常注册即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NetCore 从壹开始 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档