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

Posted

技术标签:

【中文标题】从 Blazor 应用中的中间件类获取经过身份验证的用户【英文标题】:Get authenticated user from Middleware class in Blazor app 【发布时间】:2020-04-08 05:38:26 【问题描述】:

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

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

在组件内部是这样的:

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

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

到目前为止一切顺利。

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

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 对象访问它们时它们是空的?

【问题讨论】:

注册中间件的顺序很重要。如果您在身份验证中间件之前调用中间件 - 您将看不到任何值。你能确认你在 app.UseAuthentication & app.UseAuthorization 之后添加中间件吗? @Dennis1679 谢谢,这就是问题所在...您能否提供它作为我可以接受的答案。 好的,我会写出来的。 【参考方案1】:

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

Middleware order 上的 Microsoft 文档引用:

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

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

app.UseMiddleware&lt;T&gt; 放在app.UseAuthentication()app.UseAuthorization() 之后。

【讨论】:

以上是关于从 Blazor 应用中的中间件类获取经过身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章

在 Blazor 中的视图之外访问经过身份验证的用户

如何通过组织身份验证从 Blazor Server 中的身份获取用户属性

Blazor 使用 Azure AD 身份验证允许匿名访问

如何在 Blazor WASM 中对当前经过身份验证的用户帐户信息执行 CRUD 操作?

Blazor wasm 获取更多信息并添加到用户声明中

Blazor:身份验证仍然是错误的