带有AzureAD身份验证的blazor,Context.Identity.User.Name为null

时间:2019-08-29 18:22:21

标签: azure-active-directory signalr blazor

只有经过身份验证的用户才能按预期访问应用程序。我需要能够通过Signalr跟踪用户。例如,如果我运行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");
    });

您是否知道这里是否可以保存身份信息并将其传递给SignalR?

2 个答案:

答案 0 :(得分:2)

检查您的print(self.x)并检查其声明。您可以将其粘贴在http://jwt.ms/上以对其进行解码。然后,查找返回的引用用户名的声明(在我的情况下为JWT token)。

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

Identity.Name

答案 1 :(得分:0)

目前,我的解决方法是仅在建立到集线器的连接时传递用户名。

在代码背后(SomePage.razor.cs)

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