2016-04-01 11 views
2

Ist gute Idee, um die Benutzeridentität in ASP.NET Web API Controller Konstruktor, zum Beispiel zu erhalten:ASP.NET Web API Benutzeridentität in Controller-Konstruktor

public PagesController(PageValidator pageValidator, PageMapper pageMapper, PagesManager pagesManager, UsersManager usersManager) 
      :base(usersManager) 
     { 
      _pageValidator = pageValidator; 
      _pageMapper = pageMapper; 
      _pagesManager = pagesManager; 
      if (User.Identity.IsAuthenticated) 
      _pagesManager.UserId = usersManager.GetByEmail(User.Identity.Name).Id; 
     } 

Ist immer User.Identity war richtig besiedelte vor diesem Anruf erhöhen?

Antwort

1

Ja. Sie können diese Eigenschaft in Controller an beliebiger Stelle verwenden. ASP.NET verfügt über eine Anforderungspipeline: (http://www.dotnetcurry.com/aspnet/888/aspnet-webapi-message-lifecycle). Wie Sie sehen können, ist die Autorisierung ein Frühphasenschritt in der Anforderungspipeline. Controller-Erstellung ist die neueste Stufe.

+0

Controller-Erstellung ist nicht die neueste Stufe; Controller werden vor den Filtern erstellt, und nach – Aleks

+0

wird auf die Controller * -Methode zugegriffen. Ja, Sie haben Recht. Der Filter ist jedoch eine zusätzliche Anforderungs-Pipeline, die nicht mit der ASP.NET-Pipeline in Beziehung steht. Auch nach dem Erstellungs-Controller können Sie Logik in Ihrer Aktionsmethode hinzufügen, die Anfrage validieren und so weiter ... –

+0

Die Frage war "ist es eine gute Idee" und die Antwort lautet nein. Das OP sagt nicht, * wie * die Authentifizierung durchgeführt wird. Unabhängig davon, ob es vom Host oder von einem Filter ausgeführt wird, wird auf die Identität weiterhin auf die gleiche Weise zugegriffen. Das bedeutet, wenn Sie sich entscheiden, die Authentifizierungsmechanismen irgendwann zu ändern, werden Sie Ihre Controller auf seltsame und wunderbare Weise zerbrechen. – Aleks

1

Das hat mich ein paar Mal gebissen. Je nachdem, wo/wie Sie Ihre Authentifizierung durchführen, müssen Sie vorsichtig sein, wo Sie auf Ihre Identität zugreifen, insbesondere in Controller-Konstruktoren.

Zum Beispiel, während der Steuerung Aktion nach einem IAuthenticationFilter aufgerufen wird, instanziiert wird, wird der Konstruktor ControllervorAuthenticateAsync genannt wird; Das bedeutet, dass jede Authentifizierung, die Sie in AuthenticateAsync vornehmen, nicht im Konstruktor Ihres Controllers verfügbar ist (wie in Ihrem Beispiel).

Normalerweise verlasse ich mich nicht auf Dinge, die während der Controller-Konstruktion verfügbar sind (außer wenn sie von DI bearbeitet werden). Greifen Sie stattdessen auf die Identität zu, wie Sie sie in Ihren Controller-Aktionen benötigen. Wenn Sie versuchen, die Identitätssuche einfacher zu machen (dh, ziehen Sie Ihr Benutzerobjekt basierend auf der Eigenschaft User.Identity.Name), erstellen Sie eine Basis-Controller-Klasse mit einer Eigenschaft oder Methode, die dies für Sie übernimmt. Lassen Sie dann Ihre Controller davon erben ...

public User AuthenticatedUser 
{ 
    get 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      return usersManager.GetByEmail(User.Identity.Name); 
     } 

     return null; 
    } 
} 

EDIT

Siehe here für eine detaillierte Aufschlüsselung der Web.API Lebenszyklus-Controller Schaffung zeigt, die auftritt, bevor die Authentifizierung.

+0

Rückgabe usersManager.GetByEmail (User.Identity.Name); - Dieser Code kann die Null-Referenzausnahme füllen. –

+0

Das ist richtig; genauso wie es im Konstruktor aufgerufen werden kann, wenn User.Identity noch nicht gesetzt ist. – Aleks

+0

Nicht dasselbe.Es gibt eine Überprüfung: if (User.Identity.IsAuthenticated) –