.net core 从Blazor应用程序中的中间件类获取经过身份验证的用户
我有一个服务器端Blazor应用程序。当每个用户想要访问页面时,必须对其进行身份验证。为此,用户被重定向到identity server登录页面。当用户使用正确的凭据登录时,他将被重定向回Blazor应用程序 我已经用CascadingAuthenticationState设置了Blazor应用程序,这样我就可以访问Blazor页面中的用户对象及其声明 这在组件内部是这样的:.net core 从Blazor应用程序中的中间件类获取经过身份验证的用户,.net-core,asp.net-identity,blazor,blazor-server-side,.net-core-3.1,.net Core,Asp.net Identity,Blazor,Blazor Server Side,.net Core 3.1,我有一个服务器端Blazor应用程序。当每个用户想要访问页面时,必须对其进行身份验证。为此,用户被重定向到identity server登录页面。当用户使用正确的凭据登录时,他将被重定向回Blazor应用程序 我已经用CascadingAuthenticationState设置了Blazor应用程序,这样我就可以访问Blazor页面中的用户对象及其声明 这在组件内部是这样的: [CascadingParameter] private Task<AuthenticationState>
[CascadingParameter]
private Task<AuthenticationState> AuthenticationStateTask { get; set; }
...
...
var authState = await AuthenticationStateTask;
var claims = authState.User.Claims; // Works fine.
但由于某些原因,用户声明总是空的
为什么Blazor组件中的User.Claims对象充满了所有声明,但当我通过HttpContext对象访问它们时,它们是空的?注册中间件的顺序至关重要。这也是我个人最近在自己的项目中经常遇到的问题——但是,如果您无序配置它们,则不会出现警告
引用Microsoft文档中的以下内容:
在启动时添加中间件组件的顺序。Configure方法定义在请求时调用中间件组件的顺序以及响应的相反顺序。订单对于安全性、性能和功能至关重要
您似乎在调用.NET核心身份验证中间件之前调用了中间件,因此您的用户对象为空,或者没有声明
将您的app.UseMiddleware放在app.UseAuthentication和app.UseAuthorization之后。注册中间件的顺序非常重要。如果在验证中间件之前调用中间件,则不会看到任何值。你能确认你是在app.UseAuthentication和app.UseAuthentication之后添加中间件吗?@Dennis1679谢谢,这就是问题所在。。。你能给我一个答案吗?我可以接受。是的,我会写下来的。
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);
}