如何最简单地获取请求的Authorization头部值?

6

问题

给定一个带有AuthorizationHttpRequest,最简单的方法是什么可以获取该头的身份验证类型身份验证凭据

例如,对于Authorization: Bearer YWxhZGRpbjpvcGVuc2VzYW1l,如何从HttpRequest中获取BearerYWxhZGRpbjpvcGVuc2VzYW1l两个值?

是的,我知道有Identity框架存在。但我这里没有使用它。如果你真的想试图改变我的想法,我们可以在聊天室中讨论。

我尝试过的

我正在编写一个类似以下代码的函数:

var authorizationHeader = request.Headers["Authorization"].ToArray()[0];
var authorizationParts = authorizationHeader.Split(' ');
if (authorizationParts.Length == 2 && authorizationParts[0] == "Bearer")
{
    var tokenValue = authorizationParts[1];
    // ...
}
// ...

但它非常容易出错且冗长。例如,在第一行中,我没有检查数组是否至少包含一个元素。

3个回答

12

这里是一些简单的中间件,可以做到这一点:

app.Use(async (context, next) =>
{
    if (context.Request.Headers.ContainsKey("Authorization") &&
        context.Request.Headers["Authorization"][0].StartsWith("Bearer "))
    {
        var token = context.Request.Headers["Authorization"][0]
            .Substring("Bearer ".Length);
        //do stuff...
    }

    await next.Invoke();
});

个人看法,我不太担心冗长,将上述内容移至扩展中并使其更加冗长,例如更明确地说明你正在做什么:


if (!context.Request.Headers.ContainsKey("Authorization"))
    throw new SomeException(); //or whatever

var authHeader = context.Request.Headers["Authorization"][0];
if (authHeader.StartsWith("Bearer "))
{
    var token = authHeader.Substring("Bearer ".Length);
    //do stuff...
}

0
const authorization = request.get('authorization')
  if (authorization && authorization.toLowerCase().startsWith('bearer ')) {
    return authorization.substring(7)
  }
  return null

this should work

0
你可以使用这个代码片段,它不像你的代码那样容易出错,但仍然冗长。
if (authorizationHeader != null && authorizationHeader.StartsWith("Bearer")) {
    string credentials = authHeader.Substring("Bearer ".Length).Trim();
} else {
    //Handle what happens if that isn't the case
    throw new Exception("The authorization header is either empty or isn't Bearer.");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接