我在dotnet核心中使用微服务架构。 我将Ocelot作为api网关(BFF)放在前面。 我的主要Web应用程序使用cookie身份验证和cookie中的jwt令牌。 这是为了向后兼容。 我所有的新API均使用Bearer Auth。 我想在Ocelot中从cookie中获取值并将其插入标头中。
我已经看到在配置文件中添加了标头值。 然而,由于动态性质,这将需要代码实现。 推荐的实现方法是什么?
答案 0 :(得分:2)
我们需要更改用于访问令牌的标头,因此在Ocelot中我们这样做:
public class SecurityTokenHandler : DelegatingHandler
{
private const string Racoon = "Badger";
private readonly IHttpContextAccessor contextAccessor;
public SecurityTokenHandler(IHttpContextAccessor contextAccessor)
{
this.contextAccessor = contextAccessor;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var httpRequest = this.contextAccessor.HttpContext.Request;
var securityToken = httpRequest.GetSecurityTokenFromHeader();
if (!string.IsNullOrWhiteSpace(securityToken))
{
request.Headers.Authorization = new AuthenticationHeaderValue(Racoon , securityToken);
request.Headers.Remove(Constants.OurOldAccessToken);
}
return await base.SendAsync(request, cancellationToken);
}
}
像这样注册:
services.AddDelegatingHandler<SecurityTokenHandler>(true);
效果很好,只需一点即可处理,我们所有的BFF,MS都不在乎!