webentwicklung-frage-antwort-db.com.de

Zugriff auf UserManager außerhalb von AccountController

Ich versuche, den Wert einer Spalte in der aspnetuser-Tabelle von einem anderen Controller (nicht accountcontroller) aus einzustellen. Ich habe versucht, auf UserManager zuzugreifen, kann aber nicht herausfinden, wie es geht.

Bisher habe ich Folgendes in der Steuerung ausprobiert, in der ich es verwenden möchte:

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

Dies würde nicht kompilieren (ich denke, weil UserManager den Controller nicht instanziiert hat) 

Ich habe auch versucht, eine öffentliche Methode in der AccountController zu erstellen, um den Wert zu akzeptieren, in den ich den Wert ändern möchte, und es dort zu tun. 

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

    return;
}

Wie können Sie auf Benutzerdaten außerhalb des Account Controllers zugreifen und diese bearbeiten? 

AKTUALISIEREN:

Ich habe versucht, den UserManager wie folgt auf dem anderen Controller zu instanziieren:

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

Ich habe das Projekt erfüllt (wurde etwas aufgeregt), aber als ich den Code lief, erhalte ich die folgende Fehlermeldung:

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

UPDATE 2:

Ich habe die Funktion in das IdentityModel verschoben (frage nicht, dass ich mich hier an Strohhalmen festhalte):

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

Ich bekomme jedoch immer noch folgendes:

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

In IdentitiesModels.cs gibt es auch die folgende Klasse:

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

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

Was mache ich hier falsch? Es fühlt sich an, als würde ich den falschen Baum völlig bellen. Ich versuche nur, eine Spalte in der aspnetuser-Tabelle von der Aktion eines anderen Controllers (d. H. Nicht des AccountsControllers) zu aktualisieren.

27
Spionred

Wenn Sie die Standardprojektvorlage verwenden, wird die Variable UserManager folgendermaßen erstellt:

In der Datei Startup.Auth.cs gibt es eine Zeile wie folgt:

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

dies bewirkt, dass die OWIN-Pipeline jedes Mal eine Instanz von ApplicationUserManager instanziiert, wenn eine Anforderung beim Server eingeht. Sie können diese Instanz aus der OWIN-Pipeline mit folgendem Code in einem Controller erhalten:

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

Wenn Sie Ihre AccountController-Klasse genau betrachten, sehen Sie die folgenden Codeteile, die den Zugriff auf die ApplicationUserManager-Option ermöglichen:

    private ApplicationUserManager _userManager;

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

Beachten Sie, dass Sie für den Fall, dass Sie die ApplicationUserManager-Klasse instanziieren müssen, die statische ApplicationUserManager.Create-Methode verwenden müssen, damit Sie die entsprechenden Einstellungen und Konfigurationen anwenden können.

30
Iravanchi

Wenn Sie die UserManager-Instanz in einem anderen Controller abrufen müssen, fügen Sie einfach deren Parameter im Konstruktor des Controllers wie folgt hinzu

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

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

Aber ich muss UserManager in einer Klasse bekommen, die kein Controller ist!

Jede Hilfe wäre dankbar.

UPDATE

Ich überlege, dass Sie den asp.net-Kern verwenden

FÜR MVC 5

Die Schritte für den Zugriff auf Benutzer außerhalb des Kontencontrollers oder auf Benutzererstellung sind einfach. Folgen Sie den unten stehenden Schritten 

  1. Erstellen Sie einen Controller, betrachten Sie SuperAdminController
  2. Dekoriere den SuperAdminController genauso wie den AccountController wie folgt:

    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. Methode "Benutzer in Aktion" erstellen

    [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

Ich bin auf dasselbe Problem gestoßen und habe meinen Code geändert, um einen Verweis auf die UserManager-Klasse vom Controller an das Model zu übergeben:

//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