web-dev-qa-db-ja.com

AccountControllerの外部でUserManagerにアクセスする

別のコントローラー(aspnetuserではなく)からaccountcontrollerテーブルの列の値を設定しようとしています。私はUserManagerにアクセスしようとしましたが、どうすればよいかわかりません。

これまでのところ、使用したいコントローラーで次のことを試しました。

    ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
    u.IsRegComplete = true;
    UserManager.Update(u);

これはコンパイルされません(UserManagerがコントローラーをインスタンス化していないためだと思います)

また、AccountControllerにパブリックメソッドを作成して、値を変更したい値を受け入れてそこで実行しようとしましたが、それを呼び出す方法がわかりません。

public void setIsRegComplete(Boolean setValue)
{
    ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
    u.IsRegComplete = setValue;
    UserManager.Update(u);

    return;
}

アカウントコントローラーの外部でユーザーデータにアクセスして編集するにはどうすればよいですか?

更新:

私は他のコントローラーでUserManagerをインスタンス化しようとしました:

    var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
    ApplicationUser u = userManager.FindById(User.Identity.GetUserId());

私はプロジェクトを順守しました(少し興奮しました)が、コードを実行すると次のエラーが表示されます。

Additional information: The entity type ApplicationUser is not part of the model for the current context.

更新2:

次のように、関数をIdentityModelに移動しました(ここでストローを握りしめているとは言わないでください)。

   public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
        public Boolean IsRegComplete { get; set; }

        public void SetIsRegComplete(string userId, Boolean valueToSet)
        {

            var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());
            ApplicationUser u = new ApplicationUser();
            u = userManager.FindById(userId);

            u.IsRegComplete = valueToSet;
            return;
        }
    }

しかし、私はまだ次を取得しています:

The entity type ApplicationUser is not part of the model for the current context.

IdentitiesModels.csには次のクラスもあります。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

ここで何が間違っていますか?間違ったツリーを完全にbarえているように感じます。私がやろうとしているのは、別のコントローラのアクションからaspnetuserテーブルの列を更新することです(つまり、AccountsControllerではありません)。

28
Spionred

デフォルトのプロジェクトテンプレートを使用している場合、UserManagerは次の方法で作成されます。

Startup.Auth.csファイルには、次のような行があります。

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

これにより、サーバーに要求が到着するたびに、OWINパイプラインがApplicationUserManagerのインスタンスをインスタンス化します。コントローラ内で次のコードを使用して、OWINパイプラインからそのインスタンスを取得できます。

Request.GetOwinContext().GetUserManager<ApplicationUserManager>()

AccountControllerクラスを注意深く見ると、ApplicationUserManagerへのアクセスを可能にする次のコードが表示されます。

    private ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

ApplicationUserManagerクラスをインスタンス化する必要がある場合、ApplicationUserManager.Create静的メソッドを使用して、適切な設定と構成を適用する必要があることに注意してください。

31
Iravanchi

別のUserManagerのインスタンスを取得する必要がある場合Controllerコントローラーのコンストラクターにこのパラメーターを追加するだけです。

public class MyController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

    public MyController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;;
    }
}

しかし、コントローラーではないクラスでUserManagerを取得する必要があります!

任意の助けをいただければ幸いです。

[〜#〜] update [〜#〜]

私はあなたがasp.netコアを使用していると考えています

MVC 5の場合

アカウントコントローラーの外部でusermangerまたはcreateUserにアクセスする手順は簡単です。以下の手順に従ってください

  1. コントローラーを作成し、SuperAdminControllerを検討します
  2. 以下のように、AccountControllerと同じSuperAdminControllerを飾ります。

    private readonly IAdminOrganizationService _organizationService;
    private readonly ICommonService _commonService;
    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;
    
    public SuperAdminController()
    {
    }
    
    public SuperAdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
    {
        UserManager = userManager;
        SignInManager = signInManager;
    }
    
    public SuperAdminController(IAdminOrganizationService organizationService, ICommonService commonService)
    {
        if (organizationService == null)
            throw new ArgumentNullException("organizationService");
    
    
        if (commonService == null)
            throw new ArgumentNullException("commonService");
    
        _organizationService = organizationService;
        _commonService = commonService;
    }
    
    
    public ApplicationSignInManager SignInManager
    {
        get
        {
            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set
        {
            _signInManager = value;
        }
    }
    
    
    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }
    
  3. アクションユーザーの作成方法

    [HttpPost]
    public async Task<ActionResult> AddNewOrganizationAdminUser(UserViewModel userViewModel)
    {
        if (!ModelState.IsValid)
        {
            return View(userViewModel);
        }
    
        var user = new ApplicationUser { UserName = userViewModel.Email, Email = userViewModel.Email };
        var result = await UserManager.CreateAsync(user, userViewModel.Password);
        if (result.Succeeded)
        {
            var model = Mapper.Map<UserViewModel, tblUser>(userViewModel);
    
            var success = _organizationService.AddNewOrganizationAdminUser(model);
    
            return RedirectToAction("OrganizationAdminUsers", "SuperAdmin");
    
        }
        AddErrors(result);
        return View(userViewModel);
    }
    
1
Ganesh Todkar

この同じ問題にぶつかり、コードを変更して、コントローラーからモデルにUserManagerクラスへの参照を渡しました。

//snippet from Controller
public async Task<JsonResult> UpdateUser(ApplicationUser applicationUser)
{
    return Json(await UserIdentityDataAccess.UpdateUser(UserManager, applicationUser));
}

//snippet from Data Model
public static async Task<IdentityResult> UpdateUser(ApplicationUserManager userManager, ApplicationUser applicationUser)
{
    applicationUser.UserName = applicationUser.Email;
    var result = await userManager.UpdateAsync(applicationUser);

    return result;
}
0
Mitch Stewart