2015-02-24 103 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; 
}