Аутентифицируйте консольный клиент .NET Core 2.1 SignalR в веб-приложении, которое использует «Identity as UI» - PullRequest
0 голосов
/ 08 июня 2018

Использование .NET Core 2.1 и VS2017 preview 2 Я создал простой веб-сервер с «Identity as UI», как объяснено здесь , а затем добавил чат SignalR после this .

В частности, у меня есть:

app.UseAuthentication();
app.UseSignalR((options) => {
    options.MapHub<MyHub>("/hubs/myhub");
});

..

[Authorize]
public class MyHub : Hub

..

"iisSettings": {
  "windowsAuthentication": false,
  "anonymousAuthentication": true,
     "iisExpress": {
     "applicationUrl": "http://localhost:5000",
     "sslPort": 0

Я запускаю отладчик, который открывает браузер, регистрирует пользователя и входит в систему, затем перехожу на http://localhost:5000/SignalRtest (моя страница бритвы, котораяиспользует signalr.js) и убедитесь, что чат работает нормально.

Я сейчас пытаюсь создать клиент для чата в приложении консоли .NET Core:

class Program
{
    public static async Task SetupSignalRHubAsync()
    {
        var hubConnection = new HubConnectionBuilder()
                    .WithUrl("http://localhost:5000/hubs/myhub")
                    .Build();

        await hubConnection.StartAsync();
        await hubConnection.SendAsync("Send", "consoleapp");
    }

    public static void Main(string[] args)
    {
        SetupSignalRHubAsync().Wait();
    }
}

Моя проблема в том, что я не знаю какаутентифицировать этого клиента?

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

https://github.com/aspnet/SignalR/issues/2455)

"Причина, по которой он работает в браузере, заключается в том, что в браузере есть Cookie с моментаВы вошли в систему, поэтому он отправляет его автоматически, когда SignalR делает свои запросы. Чтобы сделать что-то подобное в .NET-клиенте, вам нужно будет вызвать REST API на вашем сервере, который может установить cookie, выкопать cookie из HttpClient и затемукажите это в вызове .WithUrl, вот так:

var loginCookie = /* get the cookie */
var hubConnection = new HubConnectionBuilder()
    .WithUrl("http://localhost:5000/hubs/myhub", options => {
        options.Cookies.Add(loginCookie);
    })
    .Build();

Теперь я вознаграждаю за этот вопрос, надеясь получить решение, показывающее, как аутентифицировать консольный клиент SignalR .NET Core 2.1.с сервером SignalR веб-приложения .NET Core 2.1, которыйиспользует «Идентичность как пользовательский интерфейс».Мне нужно получить cookie-файл с сервера, а затем добавить его в SignalR HubConnectionBuilder (который теперь имеет метод WithCookie).

Обратите внимание, что я не ищу сторонние решения, такие как IdentityServer. Спасибо!

1 Ответ

0 голосов
/ 09 июня 2018

Я закончил тем, что заставил это работать так:

На сервере я создал логин и затем в Login.cshtml.cs добавил

[AllowAnonymous]
[IgnoreAntiforgeryToken(Order = 1001)]
public class LoginModel : PageModel

То есть мне не нужномаркер защиты от подделки при входе в систему (который в любом случае не имеет смысла)

Код клиента в таком случае выглядит следующим образом:

HttpClientHandler handler = new HttpClientHandler();
CookieContainer cookies = new CookieContainer();
handler.CookieContainer = cookies;
HttpClient client = new HttpClient(handler);

var uri = new Uri("http://localhost:5000/Identity/Account/Login");
string jsonInString = "Input.Email=myemail&Input.Password=mypassword&Input.RememberMe=false";
HttpResponseMessage response = await client.PostAsync(uri, new StringContent(jsonInString, System.Text.Encoding.UTF8, "application/x-www-form-urlencoded"));
var responseCookies = cookies.GetCookies(uri);
var authCookie = responseCookies[".AspNetCore.Identity.Application"];

var hubConnection = new HubConnectionBuilder()
        .WithUrl("http://localhost:5000/hubs/myhub", options =>
        {
            options.Cookies.Add(authCookie);
        })
        .Build();

await hubConnection.StartAsync();
await hubConnection.SendAsync("Send", "hello!");

(конечно, пароль будет где-то в другом месте развертывания)

...