首页 > 解决方案 > 从 Blazor 应用中的中间件类获取经过身份验证的用户

问题描述

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

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

这在组件内部是这样的:

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

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

到目前为止,一切都很好。

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

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索赔总是空的。

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

标签: .net-coreasp.net-identityblazorblazor-server-side.net-core-3.1

解决方案


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

从微软文档中引用中间件订单

在 Startup.Configure 方法中添加中间件组件的顺序定义了对请求调用中间件组件的顺序和响应的相反顺序。该顺序对于安全性、性能和功能至关重要。

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

放置你的app.UseMiddleware<T>app.UseAuthentication()app.UseAuthorization()


推荐阅读