我在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
会有效吗?
答案 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;
}