我有一个服务器端的 Blazor 应用程序。每个用户在想要访问页面时都必须进行身份验证。为此,用户被重定向到"身份服务器"登录页面。当用户使用正确的凭据登录时,他将被重定向回 Blazor 应用。
我已使用CascadingAuthenticationState
设置了我的 Blazor 应用,以便我可以在 Blazor 页面中访问User
对象及其声明。
这在组件中是这样的:
[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
声明总是空的。
为什么 Blazor 组件内部的User.Claims
对象填充了所有声明,但在通过HttpContext
对象访问它们时它们是否为空?
注册中间件的顺序至关重要。这是我个人最近在我自己的项目中经常遇到的事情 -但是,如果您无序配置它们,则不会发出警告。
引用Microsoft文档中关于中间件订单:
在 Startup.Configure 方法中添加中间件组件的顺序定义在请求时调用中间件组件的顺序以及响应的相反顺序。顺序对于安全性、性能和功能至关重要。
您似乎在 .NET Core 身份验证中间件之前调用中间件,因此您的 User 对象为 null 或缺少声明。
将app.UseMiddleware<T>
放在app.UseAuthentication()
和app.UseAuthorization()
之后。