尽管我不确定这是一个非常好的主意,但是您可以实施DelegatingHandler
以实现您要查找的内容。
public class QueryStringBearerToken : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var bearerToken = request.GetQueryNameValuePairs()
.Where(kvp => kvp.Key == "bearerToken")
.Select(kvp => kvp.Value)
.FirstOrDefault();
if(!String.IsNullOrEmpty(bearerToken))
{
request.Headers.Add("Authorization", "Bearer " + bearerToken);
}
return base.SendAsync(request, cancellationToken);
}
}
该处理器将寻找名为"bearerToken"
查询字符串,如果它存在,将其添加到请求头为后续处理/过滤处理。您可能首先检查头是否已经存在,并且在这种情况下不覆盖。您可以在配置阶段以通常的方式添加此处理程序:
config.MessageHandlers.Insert(0, new QueryStringBearerToken());
一种/YourRoute?bearerToken=theToken
请求将通过在DelegatingHandler
,将在查询字符串中的原始请求和传递给标题的列表中的令牌常规承载令牌认证将查找标题并找到它。
Thx for the reply。它有点有用,但它没有。 调试器击中代码和令牌得到正确读取,但我仍然收到一个错误消息,我没有授权。 如果我试图对代码进行硬编码,那么对于实际上拥有authorzation属性的请求会出现重复错误......我的猜测是此代码处理器在验证后启用了? – Marvin
@Marvin预计会出现重复错误。正如我所说的,我没有把逻辑处理在请求中已经有Authorization头部的情况下。将第一个委托处理程序放入管道('Insert(0,...)')应该在授权开始之前执行。 –
另一点需要注意的是,如果在查询字符串中传递标记,则编码该标记。由于'='可以是标记的一部分,所以它可能会截断'GetQueryNameValuePairs()'中的值。您应该检查您在查询字符串中传递的令牌是否与放置断点时的“bearerToken”变量相同。如果是这种情况,它会解释401因为无法识别不记名的令牌。 –