【发布时间】:2020-09-16 08:28:49
【问题描述】:
我希望看到有关如何使用 Blazor 的 WebAssembly 风格向 SignalR 集线器连接添加身份验证的示例。我的 dotnet 版本是 3.1.300。
我可以按照以下步骤使开放的、未经身份验证的 SignalR 连接正常工作:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr-blazor-webassembly?view=aspnetcore-3.1&tabs=visual-studio
我发现的所有教程似乎都较旧或针对服务器托管类型,并且不使用内置模板。
我已使用适当的模板和这些说明(包括数据库)向后端的其余部分添加了身份验证: https://docs.microsoft.com/en-us/aspnet/core/security/blazor/?view=aspnetcore-3.1
但每次我将 [Authenticate] 添加到聊天中心时,都会返回一个错误。有什么方法可以扩展第一个教程,我们可以验证那里创建的集线器?搭上内置的 ASP.NET 系统会很棒,但是如果最好的话,我只需将令牌作为附加参数传入并自己做就可以了。在这种情况下,我需要学习如何从 Blazor WebAssembly 中获取令牌,然后在服务器上的某个位置查找它。这似乎是错误的,但作为替代方案,它基本上可以满足我的需求。
那里有各种各样的半解决方案,或者是为旧版本设计的,但没有什么可以建立在 MS 提供的库存教程之上。
更新: 按照此新闻稿https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-2-release-now-available/ 中的提示,我现在可以从剃刀页面内部获取一个令牌,并将其注入到标题中。我想这很好??但是那我如何获取它并在服务器上使用它呢?
这是剃须刀代码的sn-p:
protected override async Task OnInitializedAsync()
{
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(UriHelper.BaseUri);
var tokenResult = await AuthenticationService.RequestAccessToken();
if (tokenResult.TryGetToken(out var token))
{
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.Value}");
hubConnection = new HubConnectionBuilder()
.WithUrl(UriHelper.ToAbsoluteUri("/chatHub"), options =>
{
options.AccessTokenProvider = () => Task.FromResult(token.Value);
})
.Build();
}
}
更新 2: 我在这里尝试了提示:https://github.com/dotnet/aspnetcore/issues/18697
并将我的代码更改为:
hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/chatHub?access_token=" + token.Value))
.Build();
但没有快乐。
【问题讨论】:
-
我看过了,它很有用,但最终我没有成功。我似乎已经正确地抓住了客户端中的令牌。我可以打印出来,然后出现一个大长字符串。我可以将它添加到 options.AccessTokenProvider,但服务器似乎仍然配置错误。我在启动时在 app.UseIdentityServer() 中得到一个空引用异常。我的意思是,这当然是我的全部,但如果扩展示例,即使是像我这样的菜鸟也可以得到它。
标签: authentication signalr blazor webassembly