在本地使用 SignalR 核心时,我可以使用 HubCallerContext 通过 Hub 访问我的身份声明原则,例如:
string userIdentifier = Context.UserIdentifier
我通过将 .AspNetCore.Identity.Application cookie 传递给 集线器连接生成器:
hubConnection = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"), options =>
{
options.Cookies = GetAuthCookieContainer();
})
.Build();
await hubConnection.StartAsync();
private CookieContainer GetAuthCookieContainer()
{
string cookieName = ".AspNetCore.Identity.Application";
string domainName = new Uri(Navigation.BaseUri).Host;
CookieContainer cookieContainer = new CookieContainer();
if (HttpContext.HttpContext != null)
{
var token = HttpContext.HttpContext.Request.Cookies[cookieName];
if (token != null)
{
cookieContainer.Add(new Cookie(cookieName, token) { Domain = domainName });
}
}
return cookieContainer;
}
将 Azure SignalR 服务添加到 Program.cs 后,此功能将停止工作:
builder.Services.AddSignalR().AddAzureSignalR();
这是因为将 Azure SignalR 添加到 DI 后,我无法将身份 cookie 传递给 HubConnectionBuilder,因为 HttpContext 始终为 null。除此之外,SignalR Azure 可以按预期工作。
有谁知道如何在使用 Azure SignalR 时将 AspNetCore.Identity.Application cookie 传递给 HubConnectionBuilder() 的解决方案,或者是否有更好的方法来解决此问题?
问题
将 Azure SignalR 服务添加到 DI 后,HttpContext 为 null。
解决方案
builder.Services.AddScoped<IdentityInformation>();
var state = new InitialApplicationState();
state.IsAuthenticated = HttpContext.User.Identity.IsAuthenticated;
...
<component type="typeof(App)" param-InitialState="state" render-mode="ServerPrerendered" />
@inject IdentityInformation identityInformation
[Parameter]
public InitialApplicationState InitialState { get; set; }
protected override void OnInitialized()
{
identityInformation.IsAuthenticated = InitialState.IsAuthenticated;
}
非常感谢 codewrinkles YouTube 频道提供的解决方案:https://www.youtube.com/watch?v=Eh4xPgP5PsM