SignalR加密QueryString参数



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

我正在从单独的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在这种情况下能工作吗?

要实现自定义membership提供程序,请实现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();
        }
    }

对于基本功能,所有其他方法都可以不执行

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

然后,您可以像启用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;
}

最新更新