【问题标题】:UserManager.AddToRole passes null user id to FindByIdAsyncUserManager.AddToRole 将 null 用户 ID 传递给 FindByIdAsync
【发布时间】:2015-08-18 10:07:56
【问题描述】:

我有一个 MVC 网站,它使用自定义标识和我自己的表。大部分都运行良好...添加用户、角色等。

现在我通过用户管理器将用户添加到角色中,如下所示:

var result = um.AddToRole(userID, roleName);

“嗯”是我的 UserStore 界面。在调用 AddToRole 方法之前,它会调用 FindByIdAsync 方法,为 userID 传入一个空值。不好。这打破了整个过程。

Microsoft Identity 决定如何在幕后调用这些例程,我无法弄清楚为什么会传递 null。我猜我在 UserStore 实现的一部分有问题,但我很难找到它。

当我尝试 AddToRole 时,什么调用 FindByIdAsync 方法????

【问题讨论】:

  • 请显示更多代码 - userIDroleName 来自哪里? um 在哪里以及如何初始化?
  • 哪个版本的 Identity?

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


【解决方案1】:

AddToRole 方法是一个扩展方法,定义为:

/// <summary>
/// Add a user to a role
/// 
/// </summary>
/// <param name="manager"/><param name="userId"/><param name="role"/>
/// <returns/>
public static IdentityResult AddToRole<TUser, TKey>(this UserManager<TUser, TKey> manager, TKey userId, string role) where TUser : class, IUser<TKey> where TKey : IEquatable<TKey>
{
  if (manager == null)
    throw new ArgumentNullException("manager");
  return AsyncHelper.RunSync<IdentityResult>((Func<Task<IdentityResult>>) (() => manager.AddToRoleAsync(userId, role)));
}

UserManagerExtensions。如您所见,它只是调用AddToRoleAsync,而它又被定义为:

 /// <summary>
    /// Add a user to a role
    /// 
    /// </summary>
    /// <param name="userId"/><param name="role"/>
    /// <returns/>
    public virtual async Task<IdentityResult> AddToRoleAsync(TKey userId, string role)
    {
      this.ThrowIfDisposed();
      IUserRoleStore<TUser, TKey> userRoleStore = this.GetUserRoleStore();
      TUser user = await TaskExtensions.WithCurrentCulture<TUser>(this.FindByIdAsync(userId));
      if ((object) user == null)
        throw new InvalidOperationException(string.Format((IFormatProvider) CultureInfo.CurrentCulture, Resources.UserIdNotFound, new object[1]
        {
          (object) userId
        }));
      IList<string> userRoles = await TaskExtensions.WithCurrentCulture<IList<string>>(userRoleStore.GetRolesAsync(user));
      IdentityResult identityResult;
      if (userRoles.Contains(role))
      {
        identityResult = new IdentityResult(new string[1]
        {
          Resources.UserAlreadyInRole
        });
      }
      else
      {
        await TaskExtensions.WithCurrentCulture(userRoleStore.AddToRoleAsync(user, role));
        identityResult = await TaskExtensions.WithCurrentCulture<IdentityResult>(this.UpdateAsync(user));
      }
      return identityResult;
    }

UserManager。所以如果这个电话:

TUser user = await TaskExtensions.WithCurrentCulture<TUser>(this.FindByIdAsync(userId));

正在为 userID 传递 null 然后通过查看调用链可能只是因为您正在为 userID 传递 null 值。

所以回答你的问题:

当我尝试 AddToRole 时,什么调用 FindByIdAsync 方法????

A: UserManager.AddToRoleAsync

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 2012-12-05
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2019-03-20
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多