ASP Identity FindByIdAsync实现,如果我不在我的数据库中存储Id值

时间:2015-03-03 08:52:41

标签: c# asp.net-mvc asp.net-identity

所以我为我的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方法。

1 个答案:

答案 0 :(得分:0)

您希望在users表(或任何表)中使用数字ID的原因有很多。快速索引,快速关系连接,唯一性。 ID字段应该没有意义(不是当前日期和时间的表示,不是用户名的散列,不是除了自动递增或随机整数之外的任何东西,或者在某些情况下是使用NEWSEQUENTIALID的默认值的GUID而不是只是一个新闻)除非极少数情况下,例如您使用社会安全号码或社会保险号码(加拿大),以便您的数据库以外的其他机构保证唯一性。

您使用的方法不能避免各种问题。例如,如果用户拼写错误或结婚或其他什么,用户应该可以更改他们的名字。如果您有唯一的数字ID,那么这不是问题,名称更改并不重要。您永远不希望将其可识别凭证存储在Cookie中,甚至是会话cookie,但随机ID不会侵犯其隐私和安全。我强烈建议你咬紧牙关,并在你已有的任何表定义的顶部使用数字ID。它没有任何损害并且可以帮助一切。