【问题标题】:SignalR Core not sending cookiesSignalR Core 不发送 cookie
【发布时间】:2020-10-10 09:19:00
【问题描述】:

Cookie 是我对 Web 开发最大的挫败感,它们困扰了我多年。我只想说“我讨厌 Cookie”……还有 CORS。 (请注意,我知道它们是保护我们的重要安全功能。)

我正在开发一个 Blazor WebAssembly 应用程序,我在控制器上使用 Cookie 身份验证登录用户,我可以看到该 cookie 正在所有后续请求中发送。
但 cookie 并未在发送到 SignalR Hub 的连接请求时发送。

我的目标是通过用户登录时应出现的声明对与 Hub 的所有连接进行分组。
但是我当然不能再进一步了,因为我看不到任何声明。

这是我在服务器上的TeamHub

[Authorize]
public class TeamHub : Hub
{
    public async override Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();

        var key = Context.User.Claims.FirstOrDefault(c => c.Type == IdentityUserClaims.ClientKey)?.Type;
        if (!string.IsNullOrWhiteSpace(key))
        {
            await Clients.Groups(key).SendAsync("memberConnected", new ConnectedMemberResult()
            {
                Id = Context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value,
                FirstName = Context.User.Claims.FirstOrDefault(c => c.Type == IdentityUserClaims.FirstName)?.Value,
                LastName = Context.User.Claims.FirstOrDefault(c => c.Type == IdentityUserClaims.LastName)?.Value,
                OnlineStatus = OnlineStatus.Online
            });
            await Groups.AddToGroupAsync(Context.ConnectionId, key);
        }
    }

这是我连接到集线器的代码:
这里有一些代表允许我配置请求,但我不知道在此处放置什么来为每个请求设置 cookie:

hubConnection = new HubConnectionBuilder()
    .WithUrl($"{Global.Api}teamhub", configure =>
    {
        configure.WebSocketConfiguration = opt =>
        {

        };
    })
    .Build();

【问题讨论】:

标签: c# asp.net-core cookies blazor asp.net-core-signalr


【解决方案1】:

...我几乎有了答案。
为了让 Cookies 与 Blazor 一起使用,我必须创建一个 MessageHandler

public class CredentialsDelegatingHandler : DelegatingHandler
{
    public CredentialsDelegatingHandler()
    {
        InnerHandler = new HttpClientHandler();
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request = request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
        return await base.SendAsync(request, cancellationToken);
    }
}
...
services.AddSingleton(new HttpClient(new CredentialsDelegatingHandler())
{
    BaseAddress = new Uri(Builder.HostEnvironment.BaseAddress)                
});

我只需要在这里使用相同的处理程序:

hubConnection = new HubConnectionBuilder()
    .WithUrl($"{Global.Api}teamhub", configure =>
    {
        configure.HttpMessageHandlerFactory = message =>
        {
            return new CredentialsDelegatingHandler();
        };
    })
    .Build();

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 2012-12-24
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多