2012-03-19 13 views
48

Varolan bir MVC uygulamasına bazı Web API hizmetleri ekliyorum. MVC denetleyicilerinin, bir CustomIdentity'de saklanan kullanıcı nesnesini alması için bir model bağlayıcım var. Web API eylemlerim için bunu yeniden oluşturmaya çalışıyorum. Web API'sinden IIdentity'ye erişebilir

MVC denetleyicisi veya bağlayıcı I HttpContext nesnesi bulunmamaktadır

controllerContext.HttpContext.User.Identity 

ApiController kullanabilir. Web API'sinden IIdentity nesnesine erişmek için zaten var mı?

cevap

72

ASP.NET MVC 4 RC'de GetUserPrincipal kaldırıldı. o ApiController özelliğini görünüyor Ancak Kullanıcı bu yerini aldı: http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user

+0

Ama 'IsAuthorized' yönteminizdeki Kullanıcı'ya (denetleyicinin bir özelliği olan) nasıl erişirsiniz? – Maverick

+0

"AuthorizationAttribute.IsAuthorized" yöntemini kastediyorsanız, "principal.Intity" işlevini kullanabilirsiniz. – mhu

+0

... ve nereden biri "asıl" dan geliyor? – Maverick

30

Evet yapabilirsiniz. ApiController, System.Net.Http.HttpRequestMessage; Request; Bu, mevcut istek hakkında ayrıntıları doğal olarak tutar (aynı zamanda birim sınama amaçları için bir ayarlayıcıya sahiptir). HttpRequestMessage, bir Properties sözlüğüne sahiptir; MS_UserPrincipal anahtarının değerini IPrincipal nesnesini tutar.

Bu cevabı araştırırken, bu sözlük değerine erişen bir GetUserPrincipal(this HttpRequestMessage request) uzantı yöntemine sahip olan System.Web.Http.HttpRequestMessageExtensions ile karşılaştım; Bu uzantı yöntemini daha önce görmemiştim ve Request.Properties["MS_UserPrincipal"]'a doğrudan erişiyordum, ancak bu daha iyi bir yöntem olabilir (ASP.NET Web Api ekibinde anahtarın adını aynı tutarak daha az bağımlı ...)

+0

Bunun için teşekkürler. GetUserPrincipal çalışıyor. – Magpie

+0

Teşekkürler! Nesne tarayıcısında bu oldukça belirsiz uzantı yöntemini aramak için çok zaman harcadım. –

+1

Artık çalışmıyor –

3

Sen System.ServiceModel.dll bu extension method kullanmayı deneyebilirsiniz:

public static IPrincipal GetUserPrincipal(this HttpRequestMessage request); 

olarak:

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

vardı Aynı problem ve ben bu yolu buldum. ApiController'da
base.ControllerContext.RequestContext.Principal.Identity.;

İlgili konular