.net-core - 从 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
?
解决方案
注册中间件的顺序很关键。这也是我个人最近在我自己的项目中经常遇到的问题 - 但是,如果您将它们配置为乱序,则不会出现警告。
从微软文档中引用中间件订单:
在 Startup.Configure 方法中添加中间件组件的顺序定义了对请求调用中间件组件的顺序和响应的相反顺序。该顺序对于安全性、性能和功能至关重要。
您似乎在 .NET Core 身份验证中间件之前调用了中间件,因此您的 User 对象为 null - 或缺少声明。
放置你的app.UseMiddleware<T>
后app.UseAuthentication()
和app.UseAuthorization()
。
推荐阅读
- ios - SwiftUI 中的数据关联
- vue.js - vue.js 中的复选框选择问题
- python - 使用 python 和 babel 获取翻译的国籍名称列表(或者其他什么?)
- xcode - 如何在 xcode 中添加启动图像?
- sql - IF 等于或子句
- wordpress - 带有千位分隔符和小数位分隔符的 Woocommerce 小部件自定义价格
- snowflake-cloud-data-platform - 雪花从修改的行返回数据
- verilog - SV 中的 Gauss-Seidel 实型松弛
- javafx - 是否可以将 Stage 合并到 primaryStage javaFX 中?
- python - Python IP 地址模块