在中间件.net Core 2.0中获取访问令牌

时间:2019-08-13 09:26:21

标签: c# asp.net-mvc authentication asp.net-core .net-core

在.net核心中的一个身份验证过程之后,我试图在中间件类中获取access_token。

我正在使用此代码在控制器中获取令牌

var accessToken = await HttpContext.GetTokenAsync("access_token");

但是当我想在身份验证部分之后调用的中间件上获取它时,HttpContext不存在方法GetTokenAsync

我的中间件类是

public class Session
    {
        private readonly RequestDelegate _next;
        public Session(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext httpContext)
        {
            var accessToken = // here I want to get my token

            await _next(httpContext);
        }
    }

我尝试了不同的方法,并且一直在寻找答案很长时间,但是我仍然没有解决方案。

我认为HttpContext类在中间件和控制器中有所不同,但是我不知道如何在中间件中解决该问题。

有人知道我如何才能在中间件调用中访问令牌,或者甚至可以访问令牌?

我的启动调用是泰斯语的,也许也有用。

app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMiddleware<Session>();
app.UseMvc();

2 个答案:

答案 0 :(得分:4)

using Microsoft.AspNetCore.Authentication;添加到您的中间件文件中。 这就是使用AuthenticationTokenExtensions方法的GetTokenAsync的命名空间。

答案 1 :(得分:1)

如果 access token 不在 HttpContext 中且 GetTokenAsync 返回空,您也可以直接使用 HTTP 标头:

    public async Task Invoke(HttpContext context)
    {
        // code dealing with the request
        var result = await context.GetTokenAsync("access_token") ?? context.Request.Headers["Authorization"];

        await _next(context);
        // code dealing with the response
    }

另请注意,GetTokenAsync 会给您令牌,而 context.Request.Headers["Authorization"] 会给您“bearer sdfosidfds99wn20j293n...”。您需要像这样解析标题

result.Substring(7); // size of bearer + whitespace