2015-02-24 1 views
0

Я использую SignalR по проекту Asp.net Web Api.SignalR encrypt Параметры QueryString

Я подключаюсь к концентраторам от отдельных проектов Asp.net MVC.

Все работает нормально до сих пор.

Однако, мне нужно осуществить проверку подлинности на SignalR Hubs для того, чтобы сделать это, я просто нужен token быть посылает в качестве параметра QueryString:

// Hub implementation on Asp.Net Web Api project 
public class AppHub : Hub 
{ 
    public override async Task OnConnected() 
    { 
     string token = Context.QueryString["token"]; 
     var validateResult = ValidateRequestService.ValidateToken(token); 

     Groups.Add(Context.ConnectionId, validateResult.UserName); 

     base.OnConnected(); 
    } 
} 

// Javascript implementation on Asp.net MVC project 
$.connection.hub.url = 'http://webApiProject.com/signalr'; 
$.connection.hub.qs = { 'token': '@(ViewBag.SessionToken)' }; 

Это работает.

Проблема в том, что я хранил конфиденциальную информацию (token) на клиенте (в браузере). Если хакер проверяет исходный код страницы, он может легко увидеть ключ token.

Есть ли способ зашифровать/расшифровать параметр строки запроса, чтобы он был зашифрован на стороне клиента?

Я могу легко зашифровать его на клиенте, но проблема в том, что он будет отправлен зашифрован на сервер Web Api.

Работает ли в этом случае HttpModule?

+0

SignalR поддерживает встроенные модели в ASP.NET использует это значение – Anders

+0

@ Аnders Я не использую 'FormsAuthentication'. «Токен» проверяется с использованием внешней службы. – Catalin

+0

Используйте пользовательский поставщик членства и пусть ASP.NET маршалирует аутентификацию для вас: btw, вы не ограничены формами, вы также можете использовать Windows – Anders

ответ

0

Для реализации пользовательского поставщика memebership реализации System.Web.Security.MembershipProvider

примера одного из моих проектов

public class MembershipProvider : System.Web.Security.MembershipProvider 
    { 

     ... 

     public override bool ValidateUser(string username, string password) 
     { 
      return DependencyResolver.Current.GetService<IUserManager>().ValidateUser(username, password); 
     } 
    } 

Если вам нужна роль реализации поставщика ролей System.Web.Security .RoleProvider

public class RoleProvider : System.Web.Security.RoleProvider 
    {  
     ... 

     public override string[] GetRolesForUser(string username) 
     { 
      var user = dependencyResolver.Current.GetService<IUserManager>().GetUserBy(username); 
      return user.Roles.Select(r => r.Name).ToArray(); 
     } 
    } 

Al • другие методы могут быть оставлены нереализованными для базовой функциональности

В веб-конфигурации сделать

<membership defaultProvider="MyProvider" userIsOnlineTimeWindow="20"> 
    <providers> 
    <remove name="AspNetSqlProvider" /> 
    <add name="MyProvider" type="MyApp.Web.Common.Membership.MembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" passwordFormat="Hashed" applicationName="/" /> 
    </providers> 
</membership> 
<roleManager enabled="true" defaultProvider="MyRoleProvider"> 
    <providers> 
    <clear /> 
    <add name="MyRoleProvider" applicationName="/" type="MyApp.Web.Common.Membership.RoleProvider" /> 
    </providers> 
</roleManager> 

Вы можете войти в систему как Forms AUTH был включен, например

[HttpPost] 
public bool Login([FromBody]CredentialsViewModel credentials) 
{ 
    if (Membership.ValidateUser(credentials.Username, credentials.Password)) 
    { 
     FormsAuthentication.SetAuthCookie(credentials.Username, credentials.Remember); 
     return true; 
    } 
    return false; 
}