只有经过身份验证的用户才能按预期访问应用程序。我需要能够通过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?
答案 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);
}
}