簡體   English   中英

UserManager.AddToRole將空用戶ID傳遞給FindByIdAsync

[英]UserManager.AddToRole passes null user id to FindByIdAsync

我有一個MVC網站,該網站在我自己的表中使用自定義身份。 大多數情況下一切正常……添加用戶,角色等。

現在,我通過用戶管理器將用戶添加到角色中,如下所示:

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

“ um”是我的UserStore界面。 在調用AddToRole方法之前,它將調用FindByIdAsync方法,並為用戶ID傳遞一個空值。 不好。 這破壞了整個過程。

Microsoft Identity決定如何在后台調用這些例程,但我不知道為什么會傳遞null。 我猜我在UserStore實現中有問題,但是我找不到它。

當我嘗試AddToRole時,什么叫FindByIdAsync方法?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM