繁体   English   中英

提取请求的Authorization标头的值的最简单方法是什么?

[英]What's the simplest way to fetch the value of the Authorization header of a request?

给定具有Authorization标头HttpRequest ,获取所述标头的身份 验证类型身份验证凭证的最简单方法是什么?

例如,给定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];
    // ...
}
// ...

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

这里有一些简单的中间件可以做到:

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...
}

您可以使用此代码段,它不像您的代码那样容易出错,但仍然很冗长。

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.");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM