Ocelot 增加自定义Header到下游
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ocelot 增加自定义Header到下游相关的知识,希望对你有一定的参考价值。
一般来说,通过Ocelot网关向下游转发的时候,会自定义一下Header,并且这些Header是动态的数据, 所以总体思路是从httpcontext中获取token,然后对其进行解析(可连库丰富数据),并将Claim声明添加到请求中,下放到下游微服务。
一、配置ocelot.json
1、增加AddHeadersToRequest节点
"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中配置的授权访问范围。
"AuthenticationOptions":
"AuthenticationProviderKey": "anson",
"AllowedScopes": [ "" ]
二、服务注册
主要包括认证和授权两个部分, 认证是对前端请求中token的校验过程,思路相对单一且简单,可以自定义控制鉴权的力度。
授权是对下游服务的加权,也起到了把认证中将token转化而来的Claims给下放到下游的作用。
1、认证服务
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddScheme<DemoAuthenticationOptions, DemoAuthenticationHandler>("anson", o => );
关于认证处理器,大致思路如下(伪代码):
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);
还需要授权服务 正常注册即可。
以上是关于Ocelot 增加自定义Header到下游的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 abp 的 ocelot 时如何将租户 ID 发送到下游服务
如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?