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