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

5

我正在尝试在我的中间件类中,在 .net core 中进行一次身份验证过程后获取 access_token。

我在控制器中使用以下代码获取我的令牌

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

但是当我想要将其放在身份验证后调用的中间件上时,GetTokenAsync 方法对于 HttpContext 不存在。

我的中间件类如下:

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个回答

5
在你的中间件文件中添加using Microsoft.AspNetCore.Authentication;,这是包含GetTokenAsync方法的AuthenticationTokenExtensions的命名空间。

你好,Pinki。你能帮我提供一些示例代码吗?我想在我的 Web 应用程序中以已登录用户的身份对 ADF 进行一些操作。谢谢。 - Hemant Chandurkar
我有一个Web应用程序,用于更改ADF中的对象(类似于在ADF中部署对象)。我想对ADF进行用户身份验证。我能够检测到谁正在访问Web应用程序。我获取Azure AD Id,例如user1@company.com。我想验证是否同一用户可以访问ADF,并生成承载令牌以在ADF中进行更改(使用REST API)或使用SDK。 - Hemant Chandurkar
我认为你应该针对这个问题开一个新的提问。 - pinki

2
如果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

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