SignalR加密QueryString参数

时间:2015-02-24 11:57:32

标签: asp.net asp.net-mvc encryption signalr signalr-hub

我在SignalR项目中使用Asp.net Web Api

我从单独的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会有效吗?

1 个答案:

答案 0 :(得分:0)

实施自定义会员提供程序实现 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();
        }
    }

所有其他方法都可以未实现基本功能

在网络配置中

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