SignalR Hub не получает пользователя от клиента WPF (.netcore 3.1) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть клиент WPF, который успешно подключается к концентратору, но я не могу передать пользователя клиента на концентратор.

Мой connection.User?.Identity?.Name в моем классе, реализующий из IUserIdProvider, возвращает null .

Для моего клиента WPF я использую это для подключения к хабу:

_connection = new HubConnectionBuilder()
    .WithUrl(viewModel.Endpoint, opts =>
    {
        opts.Credentials = new NetworkCredential("user", "password", "domain");
        opts.UseDefaultCredentials = true;
    })
    .Build();

Тогда у меня зарегистрирован следующий провайдер как синглтон:

    public class NameUserIdProvider : IUserIdProvider
    {
        public string GetUserId(HubConnectionContext connection)
        {
            return connection.User?.Identity?.Name;
        }
    }

Как я упоминал выше, connection.User?.Identity?.Name; возвращает ноль.

Я не знаю, что еще я могу сделать, чтобы передать имя пользователя из моего клиента (WPF) в мой концентратор.

Кстати, мой Startup.cs выглядит так:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddLogging();

        services.AddSingleton<IUserIdProvider, NameUserIdProvider>();

        services.AddSignalR(hubOptions =>
        {
            hubOptions.EnableDetailedErrors = true;
        });

        services.AddScoped<IBuildsService, BuildsService>();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthentication();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<SyncCodeHub>("/signalr");
        });
    }

Любая помощь будет высоко ценится.

РЕДАКТИРОВАТЬ:

Я обновляю код с помощью:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Но проблема не устранена, идентификационный пользователь (IUserIdProvider) возвращает ноль при вызове из клиента WPF. Я запускаю API локально с IIS Express.

РЕДАКТИРОВАТЬ:

Из документов Microsoft:

Windows Аутентификация поддерживается только клиентом браузера при использовании Microsoft Inte rnet Explorer или Microsoft Edge.

Так что мне интересно, возможно ли это даже с рабочим столом в качестве клиента. Я предполагаю, что это должно работать, поэтому мне интересно, если я все еще пропускаю точку или это ошибка, связанная с версией SignalR I # m, использующей (3.1.3)

1 Ответ

0 голосов
/ 23 апреля 2020

Вам необходимо настроить ваше ASP. NET Базовое приложение для использования Windows аутентификации путем вызова AddAuthentication в методе ConfigureServices класса Startup:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Вам также следует отредактировать файл launchSettings.json в соответствии с документами :

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
        "applicationUrl": "http://localhost:52171/",
        "sslPort": 44308
    }
}
...