11

我环顾四周寻找有关 Identity 3.0 的答案,但几乎没有发现有关获取具有 int id 的单个用户的信息。

我有一个 asp.net-core mvc6 项目,在该项目中,我已将所有具有字符串 id 的用户和角色转换为具有整数 id。

美好的。这样可行。我有一个 UserAdminController,其中包含一个更新或编辑操作,它传递了一个“int?” 为身份证。

public async Task<IActionResult> Edit(int? id)

在我的服务中,我想让用户与整数 id...“1”相关联。

我想使用 UserManger.FindByIdAsync(id) 来获取具有该 ID 的用户。

问题是,这需要一个“字符串”id 而不是“int”id。

使用 UserManger(如果可以的话)如何返回带有整数而不是字符串 id 的用户?必须有一种优雅的方式来返回用户?

4

2 回答 2

16

只需将您的用户标识符作为字符串传输...

var user = _userManager.FindByIdAsync("1");

...并且 Identity 将在内部将其转换回您在ConfigureServices使用注册时配置的密钥类型TypeConverter

public virtual Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
    cancellationToken.ThrowIfCancellationRequested();
    ThrowIfDisposed();
    var id = ConvertIdFromString(userId);
    return Users.FirstOrDefaultAsync(u => u.Id.Equals(id), cancellationToken);
}


public virtual TKey ConvertIdFromString(string id)
{
    if (id == null)
    {
        return default(TKey);
    }
    return (TKey)TypeDescriptor.GetConverter(typeof(TKey)).ConvertFromInvariantString(id);
}
于 2016-05-02T15:54:54.093 回答
5

Aliz 走在正确的轨道上,但他建议的方法在 Identity 3.0 中不存在。

但是,这确实可以使用 Aliz 选项编号 1..

var user = await _userManager.Users.FirstOrDefaultAsync(u => u.Id == id);
于 2016-05-02T15:21:45.220 回答