Azure active directory 具有AzureAD身份验证的Blazor,Context.Identity.User.Name为null

Azure active directory 具有AzureAD身份验证的Blazor,Context.Identity.User.Name为null,azure-active-directory,signalr,blazor,Azure Active Directory,Signalr,Blazor,只有经过身份验证的用户才能按预期访问应用程序。我需要能够通过信号器跟踪用户。例如,如果我运行ChatHub类型的服务,我希望人们能够使用他们的AzureAD用户名进行聊天,该用户名应自动设置,而不允许人们设置自己的用户名 中心始终显示Context.Identity.User.Name为空 services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options =&g

只有经过身份验证的用户才能按预期访问应用程序。我需要能够通过信号器跟踪用户。例如,如果我运行ChatHub类型的服务,我希望人们能够使用他们的AzureAD用户名进行聊天,该用户名应自动设置,而不允许人们设置自己的用户名

中心始终显示Context.Identity.User.Name为空

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

    services.AddTransient<HubConnectionBuilder>();


    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapBlazorHub<App>(selector: "app");
        endpoints.MapFallbackToPage("/_Host");
        endpoints.MapHub<SomeHub>("/SomeHub");
    });
services.AddAuthentication(AzureAddFaults.AuthenticationScheme)
.AddAzureAD(options=>Configuration.Bind(“AzureAd”,options));
services.AddTransient();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
端点.MapBlazorHub(选择器:“app”);
endpoints.MapFallbackToPage(“/_主机”);
endpoints.MapHub(“/SomeHub”);
});

知道这里是否有保存身份信息并传递给信号员的方法吗?

检查您的
JWT令牌
,并检查其声明。你可以通过它来解码它。然后,查找返回的引用用户名的声明(在我的例子中,它是
首选\u用户名

然后,您可以使用以下代码更改
Identity.Name
的默认映射:

services.Configure(AzureADDefaults.AuthenticationScheme,选项=>
{
options.TokenValidationParameters.NameClaimType=“”;
});

我目前的解决方法是在创建连接到集线器时只传递用户名

在codebehind中(SomePage.razor.cs)

public类SomePageBase:ComponentBase
{
[注入]
私有HubConnectionBuilder\u HubConnectionBuilder{get;set;}
[注入]
私有AuthenticationStateProvider authProvider{get;set;}
受保护的异步重写任务OnInitializedAsync()
{
var user=(等待authProvider.getAuthenticationStateAync()).user.Identity.Name;
//组件内初始化代码
var connection=\u hubConnectionBuilder//从上面插入的连接。
.WithUrl(“https://localhost:44331/SomeHub")
.Build();//构建HUB连接
等待连接。StartAsync();
var stringResult=
wait connection.InvokeAsync(“HubMethodName”,user);
}
}

当我运行fiddler并浏览blazor应用程序、登录以及所有操作时,我从未看到JWT令牌。我看见一块蓝饼干在周围传来传去。我在这里遗漏了什么?在fiddler上,尝试查找包含以下url的POST调用://oauth2/v2.0/token。然后单击JSON选项卡以获取访问令牌。解码时,请记住删除单词:access\u token=它很可能是“首选\u用户名”。因此,尝试添加:
options.TokenValidationParameters.NameClaimType=“preferred\u username”
我按照您的建议尝试了“preferred_username”,我不确定配置它的顺序,所以我在.AddAzureAd语句之前和之后都尝试了,这两种情况下的名称仍然为null。我相信这是使用Cookie auth而不是JWT,如果是的话,有没有办法从Cookie中读取用户名,或者从AzureAD请求令牌?顺序将在
之后。AddAzureAd(…)
之后。令牌中将包含正确的声明名称。另一个常见的是
name
。在fiddler上,主机将是login.microsoftonline.com,url将具有“../oauth2/…”。您必须注销并登录才能捕获它。这将是您键入密码并单击“登录”按钮后的通话。
public class SomePageBase : ComponentBase
{
    [Inject]
    private HubConnectionBuilder _hubConnectionBuilder { get; set; }

    [Inject] 
    private AuthenticationStateProvider authProvider { get; set; }

    protected async override Task OnInitializedAsync()
    {
        var user = (await authProvider.GetAuthenticationStateAsync()).User.Identity.Name;
        // in Component Initialization code
        var connection = _hubConnectionBuilder // the injected one from above.
            .WithUrl("https://localhost:44331/SomeHub")
            .Build(); // Build the HubConnection
        await connection.StartAsync();
        var stringResult =
            await connection.InvokeAsync<string>("HubMethodName", user);
    }
}