我想出了一个简单的解决方案,虽然不完美但很好。我的目标是将一些用户信息传递给集线器,以便我可以使用 userid(或任何喜欢的用户信息)注册 connectionid。迄今为止我未能实施的可用解决方案建议在连接时添加令牌。相反,我将用户信息添加到标题并在集线器上提取它,如下所示:
这是客户端代码:
@code{
[CascadingParameter]
private Task<AuthenticationState> _authstate { get; set; }
private HubConnection connection;
private AuthenticationState authstate { get; set; }
private List<string> messages = new List<string>();
protected override async Task OnInitializedAsync()
{
authstate = await _authstate;
if (authstate != null)
{
var userid = authstate.User.Identity.Name;
connection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/myhub"), options => {
options.Headers.Add("USERID", userid);
})
.WithAutomaticReconnect()
.Build();
connection.On<string, string>("ReceiveMessage", ReceiveMessage);
await connection.StartAsync();
}
}
public void ReceiveMessage(string user, string msg)
{
messages.Add(user + " " + msg);
StateHasChanged();
}
public async void InvokeSomething()
{
await connection.InvokeAsync("InvokeSomething");
}
}
这是我在集线器上提取用户信息的方式:
public async Task InvokeSomething()
{
var httpCtx = Context.GetHttpContext();
var name = httpCtx.Request.Headers["USERID"].ToString();
await Clients.All.SendAsync("ReceiveMessage", name, " invoked this");
}`
它有效。在 OnConnectedAsync 中也使用相同的方法。
希望这对某人有所帮助。 github repo 中的更新代码。
集线器上的 Authorize 属性使应用程序崩溃。所以我认为与集线器的连接没有经过身份验证(微软文档声称我们不需要做任何其他事情)。我希望比我有更好技能的人提供更好的解决方案。与此同时,这似乎正在发挥作用。
更新
找到解决方案
为了启用 Hub 类的授权,必须将用户通过身份验证时创建的安全 cookie 传递给 Blazor Server SPA 应用。您应该在创建集线器连接时传递 cookie。这将允许您通过 Context 对象在 Hub 中访问所有声明,例如 UserIdentofier 和 UserName。