2017-07-03 2 views
0

In ASP.NET Identity 2 or 3 ist es möglich, Benutzerinformationen auf Klassenebene zu erhalten? Szenario ist wie folgt: Es gibt nur zwei Rollen in der App, nämlich AdminRole und RegRole. Ein Benutzer in einer AdminRole kann in UserRole als Benutzer fungieren, indem er einen Benutzernamen aus einer Dropdown-Liste auswählt, die nur für den Benutzer "AdminRole" verfügbar ist. Was ich tun muss, ist, dass, wenn ein Admin einen Benutzer aus dem Dropdown von Homepage auswählt, ich den Namen des ausgewählten Benutzers einer Variablen der Klasse (das ist ein Controller) zuweisen muss, damit der Benutzername für alle verwendet werden kann Aktionsmethoden dieses Controllers (eine Klasse). Ich habe versucht, die folgenden, aber es wirft NullException bei if (User.Identity.Name == "Admin") Linie des Codes unter:Abrufen von Benutzerinformationen auf Klassenebene in ASP.NET Identity

NullReferenceException: Object reference not set to an instance of an object.

Home Controller [Wo Admin einen Benutzernamen aus einer Dropdown wählt]

public class HomeController : Controller 
{ 
    ... 
    [HttpPost] 
    public IActionResult ChooseUser(string selectedUser) 
    { 
     HttpContext.Session.SetString(SessionKeySelUser, selectedUser); 

     return View(); 
    } 
} 

Andere Controller- [ Wo ich den ausgewählten Benutzernamen von oben in allen Aktionsmethoden des folgenden Controllers verwenden möchte:

public class TestController : Controller 
{ 
    private MyProjContext _context; 
    private string _userName; 

    public TestController (MyProjContext context) 
    { 
    _context = context; 

    if (User.Identity.Name == "Admin") 
     _userName = HttpContext.Session.GetString("selectedUser"); //This session variable was assigned the user name value when the admin had selected the user name from the dropdown on the home page 
    } 
} 

//use the class level variable _userName in all action methods like the one below 
public IActionResult TestAction() 
{ 
    _context.Orders.Where(ord => ord.Seller == _userName); 

    return View(); 
} 

.... 

Antwort

0

Wenn Sie Identity 3 verwenden, müssen Sie eine Instanz von UserManager abrufen, um den aktuell angemeldeten Benutzer abzurufen.

Sie können eine Instanz von UserManager mit iOC erhalten und dann die GetUserAsync Methode des UserManager verwenden das aktuelle Benutzer-Objektmodell zu erhalten.

protected readonly UserManager<AppUser> UserManager; 
private Task<AppUser> GetCurrentUserAsync() => UserManager.GetUserAsync(HttpContext.User); 

public TestController(UserManager<AppUser> userManager) 
{ 
    UserManager = userManager; 
} 

Ihr Zustand kann dies geändert werden:

var curUser = await GetCurrentUserAsync(); 
if (curUser.Name == "Admin") 
     _userName = HttpContext.Session.GetString("selectedUser"); //This session variable was assigned the user name value when the admin had selected the user name from the dropdown on the home page 

Da Sie es aus dem Konstruktor zugreifen versuchen, Sie Result vor hinzufügen kann es synchron zu machen. Wie Sie über Kommentare berichtet haben, ist der HttpContext des Controllers null, wenn die Klasse erstellt wird. Sie können jedoch von IHttpContextAccessor auf es zugreifen.

public TestController(UserManager<AppUser> userManager, IHttpContextAccessor httpContextAccessor) 
{ 
    UserManager = userManager; 
    var curUser = UserManager.GetUserAsync(httpContextAccessor.HttpContext.User).Result; 
    if (curUser.Name == "Admin") 
     _userName = HttpContext.Session.GetString("selectedUser"); 
} 

Wenn Sie Identity verwenden, glaube ich, dass IHttpContextAccessor in die Pipeline eingespritzt wird. Wenn es null zurückgibt, müssen Sie es als Singleton in Ihrer Klasse Startup hinzufügen.

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
+0

Ich nehme an 'Aufgabe ' du meintest 'Aufgabe '. Wie auch immer, in Zeile 'GetCurrentUserAsync.Name ==" Admin "' bekomme ich Fehler: ** Task 'enthält keine Definition für Name **. – nam

+0

Sie haben Recht. Ich habe gerade die Antwort aktualisiert. Ich benutze einen benutzerdefinierten Benutzer, deshalb habe ich die Klasse AppUser genannt. Der Standardwert ist ApplicationUser. –

+0

Ja, aber der gleiche Fehler bleibt bestehen. – nam

Verwandte Themen