/ / Autoryzacja w SignalR 2.0 - asp.net, autoryzacja, signalr, signalr-hub

Autoryzacja w SignalR 2.0 - asp.net, autoryzacja, sygnał, hub sygnałowy

Mam serwer sieci Web z uwierzytelnianiem formularzy iinny serwer, który obsługuje Huby SignalR. Za pomocą pliku cookie uwierzytelniania formularzy chcę wyodrębnić bieżącego użytkownika za pomocą poniższego kodu. Byłoby to możliwe przy użyciu HttpModule, ale przy użyciu SignalR nie można użyć HttpModule.

Czy istnieje inny sposób zarchiwizowania tego, co chcę zrobić?

public class AuthorizationHubModule : HubPipelineModule
{
public AuthorizationHubModule()
{
}

protected override bool OnBeforeConnect(IHub hub)
{
var cookies = hub.Context.Request.Cookies;
if (cookies.ContainsKey(".ASPXAUTH") == true)
{
// Get the user, populate the Thread.CurrentUser...
Cookie cookie = cookies[".ASPXAUTH"];

if (cookie != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);

GenericIdentity identity = new GenericIdentity(ticket.Name);
GenericPrincipal principal = new GenericPrincipal(identity, new string[0]);

// Cannot do this because User is readonly (this is possible in a normal HttpModule)
//hub.Context.User = principal;
}
}

return base.OnBeforeConnect(hub);
}
}

Chcemy ustawić IPrincipal związany z SignalR.

Odpowiedzi:

1 dla odpowiedzi № 1

Jeśli się nie mylę, próbujesz wyodrębnić dane użytkownika zalogowanego użytkownika z kontekstu. Jeśli jest to poprawne, można to po prostu osiągnąć, wykonując następujące czynności:

  1. Dodaj atrybut [Autoryzuj] do swojej klasy centrum.
  2. Następnie użyj Context.User.Identity, aby uzyskać tożsamość użytkownika.

Ponieważ korzystasz z trwałego połączenia, proces autoryzacji musiałby być przez ciebie zadbany. Odnosić się ten link i możesz dostosować kod tam dostarczony zgodnie z potrzebami.

Aby zmienić tożsamość żądania, musisz dodać FormsAuthentication_OnAuthenticate do pliku global.asax. Oto przykładowy kod, który napisałem dla mojej aplikacji:

protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e)
{
if (FormsAuthentication.CookiesSupported == true)
{
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
try
{
string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;

//Let us set the Pricipal with our user specific details
e.User = new System.Security.Principal.GenericPrincipal(
new System.Security.Principal.GenericIdentity(username, "Forms"), _user.GetUserRoles(username));
}
catch (Exception)
{
//somehting went wrong
}
}
}
}

Mam nadzieję że to pomoże.


1 dla odpowiedzi nr 2

Okazuje się, że Signal-R nie może modyfikowaćskojarzony z IPrincipal, ponieważ SignalR nie jest przeznaczony do uwierzytelniania, ale pobiera kontekst uwierzytelnienia z aplikacji. Tak więc, jak wskazał @Shashank, właściwym sposobem na zrobienie tego jest użycie Formularzy lub czegokolwiek, co wykorzystasz w swojej aplikacji, a SignalR uzyska z tego kontekst.


0 dla odpowiedzi № 3

Zaimplementuj interfejs IUserIdProvider i dodaj za pomocą

GlobalHost.Configuration.Resolver.Register(typeof(IUserIdProvider), () => provider.Object);

Możesz przeczytać więcej tutaj.