我有一个服务器端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
对象访问它们时,它们是空的吗?
答案 0 :(得分:4)
注册中间件的顺序很关键。这也是我最近在我自己的项目中经常遇到的问题-但是,如果您对它们进行无序配置,则不会发出警告。
Microsoft文档对Middleware order的引用:
在Startup.Configure方法中添加中间件组件的顺序定义了对请求调用中间件组件的顺序以及响应的相反顺序。该顺序对于安全性,性能和功能至关重要。
似乎您是在.NET Core身份验证中间件之前调用中间件,因此您的User对象为null-或缺少声明。
将app.UseMiddleware<T>
放在app.UseAuthentication()
和app.UseAuthorization()
之后。