【问题标题】:SignalR encrypt QueryString parametersSignalR 加密 QueryString 参数
【发布时间】:2015-02-26 01:08:39
【问题描述】:

我在 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 在这种情况下会起作用吗?

【问题讨论】:

  • SignalR 支持在 ASP.NET 中使用的内置模型
  • @Anders 我没有使用FormsAuthenticationtoken 使用外部服务进行验证
  • 使用自定义成员资格提供程序并让 ASP.NET 为您编组身份验证:顺便说一句,您不仅限于 Forms,您也可以使用 Windows
  • 带有 SignalR 的 Web Api 服务器根本不知道成员资格。它只能使用第三方服务(通过 Http 请求)验证请求 - 我不能使用会员资格
  • 您可以使用 CUSTOM 会员提供商,这样您就可以将客户端/服务器安全部分外包给 ASP.NET,而无需担心您的解决方案是否安全。

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


【解决方案1】:

要实现自定义成员资格提供程序,请实现 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;
}

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多