Sho*_*hoe 1 .net c# asp.net http asp.net-core
给定HttpRequest带有Authorization标头的,获取该标头的身份验证类型和身份验证凭证的最简单方法是什么?
作为一个例子,给出的Authorization: Bearer YWxhZGRpbjpvcGVuc2VzYW1l,我怎么能同时获得Bearer和YWxhZGRpbjpvcGVuc2VzYW1l从HttpRequest?
是的,我知道Identity框架存在。我在这里不使用它。如果您真的想尝试改变主意,我们可以在聊天中讨论。
我正在按照以下方式编写函数:
var authorizationHeader = request.Headers["Authorization"].ToArray()[0];
var authorizationParts = authorizationHeader.Split(' ');
if (authorizationParts.Length == 2 && authorizationParts[0] == "Bearer")
{
var tokenValue = authorizationParts[1];
// ...
}
// ...
Run Code Online (Sandbox Code Playgroud)
但这是非常容易出错和冗长的。例如,在第一行中,我没有检查数组是否包含至少一个元素。
这里有一些简单的中间件可以做到:
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();
});
Run Code Online (Sandbox Code Playgroud)
就我个人而言,尽管我不太关心冗长程度,但可以将上面的内容移至扩展名并使其更加冗长,例如,通过更明确地说明自己在做什么:
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...
}
Run Code Online (Sandbox Code Playgroud)