从 Blazor 应用中的中间件 class 获取经过身份验证的用户

Get authenticated user from Middleware class in Blazor app

我有一个服务器端 Blazor 应用程序。每个用户在访问页面时都必须经过身份验证。为此,用户被重定向到 "identity server" 登录页面。当用户使用正确的凭据登录时,他将被重定向回 Blazor 应用。

我已经使用 CascadingAuthenticationState 设置了我的 Blazor 应用程序,这样我就可以在我的 Blazor 页面中访问 User 对象及其声明。

这在组件内部是这样的:

[CascadingParameter]
private Task<AuthenticationState> AuthenticationStateTask { get; set; }
...
... 
var authState = await AuthenticationStateTask;
var claims = authState.User.Claims; // Works fine.

当我这样做时,我可以访问用户声明。

到目前为止一切顺利。

但我还有一个 中间件 class,我需要在其中访问用户声明。

public async Task InvokeAsync(HttpContext context)
{
    if (context?.User?.Claims != null && context.User.Claims.Any())
    {
        Console.WriteLine("aaa");
    }

    // Call the next delegate/middleware in the pipeline
    await _next(context);
}

但由于某些原因,User 声明总是空的。

为什么我的 Blazor 组件中的 User.Claims 对象充满了所有声明,但当我通过 HttpContext 对象访问它们时它们是空的?

注册中间件的顺序很关键。这也是我个人 运行 最近在我自己的项目中经常遇到的问题 - 然而,如果您乱序配置它们,则不会出现警告。

引自 Microsoft 文档 Middleware order:

The order that middleware components are added in the Startup.Configure method defines the order in which the middleware components are invoked on requests and the reverse order for the response. The order is critical for security, performance, and functionality.

您似乎是在 .NET Core 身份验证中间件之前调用您的中间件,因此您的用户对象为空 - 或者缺少声明。

将您的 app.UseMiddleware<T> 放在 app.UseAuthentication()app.UseAuthorization() 之后。