所以我为我的MVC5项目有一个自定义UserStore实现IUserStore,但是我没有在我的数据库中保存Id值。因此,当我实现FindByIdAsync时,我只是创建一个新的TUser实例并将其作为结果传递。到目前为止我没有任何问题,但这样安全吗?我不希望这个黑客后来咬我。
我的用户商店:
public Task<TUser> FindByIdAsync(string userId)
{
TUser user = (TUser)Activator.CreateInstance(typeof(TUser));
user.UserName = userId;
user.Password = null;
//I'm suppose to query the database with userId parameter here
return Task.FromResult<TUser>(user); //return as is
}
public Task<TUser> FindByNameAsync(string userName)
{
TUser user = (TUser)Activator.CreateInstance(typeof(TUser));
user = usertable.GetUserByUserName(userName);
return Task.FromResult<TUser>(user);
}
我的身份
public class IdentityUser : IUser
{
public IdentityUser()
{
_id = Guid.NewGuid().ToString();
}
private string _id;
public string Id {
get { return _id; }
}
public string UserName { get; set; }
public virtual string Password { get; set; }
public virtual string Email { get; set; }
}
更新:安全,我的意思是我以后实现其他UserStore接口没有问题,因为当我调试我的代码时,我发现在SignInManager.PasswordSignInAsync上调用了FindByIdAsync方法。
答案 0 :(得分:0)
您希望在users表(或任何表)中使用数字ID的原因有很多。快速索引,快速关系连接,唯一性。 ID字段应该没有意义(不是当前日期和时间的表示,不是用户名的散列,不是除了自动递增或随机整数之外的任何东西,或者在某些情况下是使用NEWSEQUENTIALID的默认值的GUID而不是只是一个新闻)除非极少数情况下,例如您使用社会安全号码或社会保险号码(加拿大),以便您的数据库以外的其他机构保证唯一性。
您使用的方法不能避免各种问题。例如,如果用户拼写错误或结婚或其他什么,用户应该可以更改他们的名字。如果您有唯一的数字ID,那么这不是问题,名称更改并不重要。您永远不希望将其可识别凭证存储在Cookie中,甚至是会话cookie,但随机ID不会侵犯其隐私和安全。我强烈建议你咬紧牙关,并在你已有的任何表定义的顶部使用数字ID。它没有任何损害并且可以帮助一切。