2012-03-19 14 views
48

Aggiungo alcuni servizi API Web a un'applicazione MVC esistente. Ho un raccoglitore modello per i miei controller MVC per ottenere l'oggetto utente memorizzato in CustomIdentity. Sto cercando di riprodurlo per le mie azioni API Web.Posso accedere a IIdentity dall'API Web

Nel controller MVC o dei suoi leganti posso usare

controllerContext.HttpContext.User.Identity 

L'ApiController non ha l'oggetto HttpContext. Esiste comunque l'accesso all'oggetto IIdentity dall'API Web?

risposta

72

Essi rimosso GetUserPrincipal in ASP.NET MVC 4 RC. Tuttavia sembra che la proprietà ApiController utente ha sostituito questo: http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user

+0

Ma come si accede a User (che è una proprietà del controller) nel metodo 'IsAuthorized'? – Maverick

+0

Se si intende il metodo 'AuthorizationAttribute.IsAuthorized', è possibile utilizzare' principal.Identity'. – mhu

+0

... e da dove si otterrebbe il "principale"? – Maverick

30

Sì, è possibile. ApiController ha una proprietà Request di tipo System.Net.Http.HttpRequestMessage; questo tiene naturalmente i dettagli sulla richiesta corrente (ha anche un setter per scopi di test unitari). HttpRequestMessage ha un dizionario Properties; troverai il valore della chiave MS_UserPrincipal contenente l'oggetto IPrincipal.

Nella ricerca di questa risposta, mi sono imbattuto nel System.Web.Http.HttpRequestMessageExtensions che ha un metodo di estensione GetUserPrincipal(this HttpRequestMessage request) che accede a questo valore di dizionario; Non avevo visto questo metodo di estensione prima e stava accedendo Request.Properties["MS_UserPrincipal"] direttamente, ma questo potrebbe essere un metodo migliore (meno dipendente del team Web Api ASP.NET mantenendo il nome della chiave stessa ...)

+0

Grazie per questo. GetUserPrincipal funziona. – Magpie

+0

Grazie! Probabilmente avrei sprecato un sacco di tempo a cercare questo metodo di estensione piuttosto oscuro nel browser degli oggetti. –

+1

Non funziona più –

3

Si può cercare di utilizzare questo extension method da System.ServiceModel.dll:

public static IPrincipal GetUserPrincipal(this HttpRequestMessage request); 

come:

IPrincipal principal = request.GetUserPrincipal(); 
IIdentity identity = principal.Identity; 
2

ho avuto lo stesso problema e ho trovato in questo modo. Nel tuo ApiController puoi usare
base.ControllerContext.RequestContext.Principal.Identity.;

Problemi correlati