Ich arbeite an einem WebApi-Projekt mit Asp.Net.Identity v2 (mit AspNetUser geändert, um int-IDs zu verwenden). Ich wollte ein wenig Refactoring durchführen, indem ich eine Basisklasse für alle meine Web-API-Controller erstelle. Insbesondere wollte ich, dass die Klasse MyBaseController
die Logik zum Abrufen der aktuellen Benutzer-ID kapselt.Warum gibt User.Identity.GetUserId <int>() im WebApi Controller überall 0 zurück, außer in Aktionsmethoden?
Zuvor wurde jede Aktionsmethode in jeder Steuerung als User.Identity.GetUserId<int>()
bezeichnet. es war umständlich aber funktionierte.
Jetzt entschied ich, diesen Aufruf entweder im Konstruktor der Basisklasse oder in seiner Eigenschaft zu kapseln. Es funktioniert jedoch nicht: Das Identity
Objekt, das ich bekomme, ist leer (IsAuthenticated = false, Name = null...
), und GetUserId<int>()
gibt immer 0
zurück.
Scheinbar ist nur innerhalb einer Aktionsmethode Identity
ausgefüllt und GetUserId<int>()
gibt ein korrektes Ergebnis zurück?
Hier ist im Grunde, was ich bekommen:
public class MyBaseController : ApiController
{
public int UserId => User.Identity.GetUserId<int>(); // **this always returns 0**
public MyBaseController() : base()
{ var userId = User.Identity.GetUserId<int>(); // **this is always 0** }
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
var userId = User.Identity.GetUserId<int>(); // **also 0**
}
public IHttpActionResult Get() {
var userId = User.Identity.GetuserId<int>(); // **the only place where it returns userId properly**
// some code ...
}
}
Gibt es eine Möglichkeit User.Identity
andere als in einem Aktionsmethode zu greifen etwas mit ihm in einer Basisklasse zu tun?
Das Projekt zunächst in VS 2013 mit MVC 5/WebAPI 2, jetzt wurde geschaffen, um VS2015 migriert
vielleicht dies: http://StackOverflow.com/a/1045602/1346098 –