2016-03-25 3 views
1

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

+0

vielleicht dies: http://StackOverflow.com/a/1045602/1346098 –

Antwort

0

Sie eine Eigenschaft in den Basis-Controller verwenden:

public abstract class MyBaseController : ApiController 
{ 
    public int UserID 
    { 
     get { return User.Identity.GetUserId<int>(); } 
    } 
} 

public class MyNormalController : MyBaseController 
{ 
    public ActionResult Index() 
    { 
     var userId = UserID; // put in variable to avoid multiple calls 
     // some code ... 
    } 
} 
+0

Danke @PeterB, aber was ist, wenn ich es mit meiner Basisklasse machen möchte? z.B. Angenommen, ich möchte einige Informationen basierend auf der Benutzer-ID laden oder sie an einen Dienst innerhalb meiner Basisklasse weitergeben? auf keinen Fall? – AunAun

+0

Sie können sicher sein, wenn es während einer Aktion passiert, die einen Aufruf an die Basisklasse macht. Abgesehen davon bin ich mir nicht sicher. Die Lebensdauer oder Verfügbarkeit des entsprechenden HttpContext könnte kurz oder lang sein, aber ich weiß es einfach nicht. –

Verwandte Themen