Наконец-то я получил свой ответ.
Было предложено использовать ASP NET Удостоверение, которое очень допустимо, но я уже создал простую аутентификацию и управление пользователями. Это небезопасно и наполовину хорошо, как ASP NET Идентичность (я обдумал это и обдумал), но это всего лишь личный проект, а не производственный, поэтому, если он будет развиваться, я могу переключиться на Идентичность или даже реализовать сам;) Но это не тот случай.
Это потребовало немного дополнительных шагов, поэтому:
Мне нужно было включить сеансы в ASP. NET Core, я использовал эту статью для этой цели. Имея это, я могу сохранить свой логин пользователя и предоставить его поставщику идентификаторов пользователей для signalR
Добавление поставщика идентификаторов пользователя cutsom для SignalR в. NET:
Мне нужно было создать такой класс
public class UserIdProvider : IUserIdProvider
{
public static readonly string SESSION_LOGIN_KEY = "loggedUser";
private readonly IHttpContextAccessor _httpContextAccessor;
public UserIdProvider(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public string GetUserId(HubConnectionContext connection)
{
var session = _httpContextAccessor.HttpContext.Session;
session.TryGetValue(SESSION_LOGIN_KEY, out byte[] loginBA);
if (loginBA == null)
{
return null;
}
return new string(loginBA.Select(b => (char)b).ToArray());
}
}
Итак, после регистрации я могу установить логин в Session
, чтобы он стал переменной "state", и использовать его в вышеприведенном классе.
Кроме того, нужно добавить его в ASP сервисах, как показано ниже (в Startup.ConfigureServices
):
services.AddSingleton<IUserIdProvider, UserIdProvider>();
Также есть одна вещь, которую еще нужно установить: в UserIdProvider
нам нужно получить доступ от Session
до HttpContext
. Чтобы использовать HttpContext
, нам нужно указать его, как показано ниже (также в Startup.ConfigureServices
):
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
, который передает HttpContextAccessor
конструкторам serices.
После всего этого, Вы можете получить доступ к пользователям в SignalR Hub
с помощью их логинов, которые установлены в Context.UserIdnentifier
Это также позволяет отправлять сообщения указанному c пользователю, просто передавая его логин (клиент внешнего интерфейса просто выбирает пользователя) , как показано ниже:
public async Task SendMessage(string message, string user)
{
await Clients.User(user).SendAsync("ReceiveMessage", message).ConfigureAwait(false);
}
ПРИМЕЧАНИЕ Была одна проблема, хотя. Браузеры на компьютере не сохраняли сеансы, которые я решил (также в Startup.ConfigureServices
):
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => false; // <~~~~ This needs to be set to false
options.MinimumSameSitePolicy = SameSiteMode.None;
});
Без этого вам нужно быть осторожным с файлами cookie, если вы не принимаете их на сайт, он не будет работать, так как логин пользователя не будет сохранен.