Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 从Blazor应用程序中的中间件类获取经过身份验证的用户_.net Core_Asp.net Identity_Blazor_Blazor Server Side_.net Core 3.1 - Fatal编程技术网

.net core 从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>

我有一个服务器端Blazor应用程序。当每个用户想要访问页面时,必须对其进行身份验证。为此,用户被重定向到identity server登录页面。当用户使用正确的凭据登录时,他将被重定向回Blazor应用程序

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

这在组件内部是这样的:

[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);
}