2015-02-24 104 views
0

我在Asp.net Web Api項目上使用SignalRSignalR加密QueryString參數

我從分開的Asp.net MVC項目連接到集線器。

一切正常,直到現在。

但是,我需要實現認證的SignalR Hubs,爲了做到這一點,我只需要一個token被髮送的查詢字符串參數:

// 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 2015-02-24 12:05:12

+0

@Anders我沒有使用'FormsAuthentication'。使用外部服務驗證'token' – Catalin 2015-02-24 12:07:39

+0

使用自定義成員資格提供程序並讓ASP.NET編組身份驗證碼以供編輯:btw,您不僅限於Forms,還可以使用Windows – Anders 2015-02-24 12:13:16

回答

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 l其他方法可以做到留給未實現的基本功能

在web配置

<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> 

然後,您可以登錄像窗體身份驗證,例如啓用

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