【问题标题】:Identity 3.0 Getting a user by id when the id is "int"Identity 3.0 当 id 为“int”时通过 id 获取用户
【发布时间】:2016-08-27 06:57:33
【问题描述】:

我已经四处寻找有关 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 的用户?必须有一种优雅的方式来返回用户?

【问题讨论】:

  • 用户由一个字符串的 GUID 标识,这就是 FindByIdAsync 函数将字符串作为参数的原因,为什么要使用 int ?
  • 将我的用户设置为具有 int id 而不是 GUID。我正在将“Get”方法中的 int id 传递给我的服务,并且需要返回与该 id 关联的用户。我想使用通过依赖注入提供的用户管理器。

标签: asp.net-core-mvc asp.net-identity-3


【解决方案1】:

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

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

...身份将internally convert it back to the key type 使用TypeConverterConfigureServices 中注册时配置:

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);
}

【讨论】:

  • 哇哦,太可怕了。在 .net 核心中,这似乎是唯一的答案。
  • 很糟糕,尽管它可能是完全不必要的强制转换,但为了上下文安全,这是正确的答案。
【解决方案2】:

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

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

var user = await _userManager.Users.FirstOrDefaultAsync(u => u.Id == id);

【讨论】:

  • 不确定为什么这被标记为正确答案 - 虽然这在 90% 的情况下都有效,但在将 UserManager 检索与直接 DBContext 检索混合和匹配时,您可能会遇到一些奇怪的行为(这就是做)在编辑时,因为每个都有自己的活动上下文并进行更改。
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2023-03-16
  • 2021-03-06
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多