Geçerli kullanıcıyı bir ApiController eylemi içinde, userID'yi parametre olarak iletmeden alın


97

Güvenli bir ApiController eylemi içinde, userName veya userId'yi parametre olarak iletmeden mevcut kullanıcıyı nasıl elde ederiz?

Bunun mevcut olduğunu varsayıyoruz çünkü güvenli bir eylem içindeyiz. Güvenli bir işlemde olmak, kullanıcının kimliğini önceden doğruladığı ve isteğin taşıyıcı jetonuna sahip olduğu anlamına gelir. WebApi'nin kullanıcıyı yetkilendirdiği göz önüne alındığında, bir eylem parametresi olarak iletmek zorunda kalmadan userId'ye erişmek için yerleşik bir yol olabilir.


Lütfen şu cevaba bakın: stackoverflow.com/a/26453782/3290276 İddiayı ekleyin hile yaptı
Gabriela Macias

Yanıtlar:


149

WebApi 2'de RequestContext.Principal, ApiController'daki bir yöntem içinden kullanabilirsiniz .


1
Görünüşe göre o mülke sahip değiliz. Hmm. Belki WebApi'nin eski bir sürümünü kullanıyoruz.
Shaun Luttin

2
@ShaunLuttin Tamam, yani Web API 1 kullanıyorsanız, ApiController'da bir Prinicpal özelliği olduğuna inanıyorum. Bu, Request.Properties koleksiyonuna erişimle ilgili süslü bir sarmalayıcıdır. Ana nesne bu sözlükte saklanır.
Darrel Miller

6
Unutmayınusing Microsoft.AspNet.Identity;
Overlord

1
@DarrelMiller, kodun diğer bölümlerinden (denetleyicinin içinden değil) aynı şeyi (bağlamı iste) almanın bir yolu var.
Ajay Aradhya

2
@AjayAradhya Sadece oradan geçerseniz. Web çerçeveleriyle ilgili önceki çalışmalar, istek bağlamına erişmek için statik özelliklerin kullanılmasının her türlü mimari soruna neden olduğunu göstermiştir. İlk başta kullanışlıdır ama uzun vadede çok fazla acıya neden olur.
Darrel Miller

36

Müdürüne Userözelliği kullanarak da erişebilirsiniz ApiController.

Dolayısıyla aşağıdaki iki ifade temelde aynıdır:

string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();

15
Burada yazdıklarınızı kullanmaya çalışıyorum ama GetUserId () işlevi her zaman boş döndürüyor. Kullanıcı yetkilendirildi, bir taşıyıcı belirteci geçiyorum ve ApiController'da [Yetkilendir] başlığı var
Joshua Ohana

GetUserId () işlevi, yalnızca kullanıcının bir NameIdentifier talebi varsa bir kimlik döndürür. Bunun nasıl çözüleceğine dair bir örnek için,
Oswaldo'nun cevabına

14

İpucu, Webapi2 otomatik oluşturulan hesap denetleyicisinde yatıyor

Alıcıya sahip bu mülkü şu şekilde tanımlayın:

public string UserIdentity
        {
            get
            {
                var user = UserManager.FindByName(User.Identity.Name);
                return user;//user.Email
            }
        }

ve UserManager almak için - WebApi2'de - Romalılar gibi yapın (AccountController olarak okuyun)

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }

Bu, IIS ve kendi kendine barındırma modunda uyumlu olmalıdır


7

Yukarıdaki önerilerin hiçbiri benim için işe yaramadı. Aşağıdakiler yaptı!

HttpContext.Current.Request.LogonUserIdentity.Name

Sanırım çok çeşitli senaryolar var ve bu benim için çalıştı. Senaryom, her ikisi de IIS altında çalışan bir AngularJS ön ucu ve bir Web API 2 arka uç uygulaması içeriyordu. Her iki uygulamayı da yalnızca Windows Kimlik Doğrulaması altında çalışacak şekilde ayarlamak zorunda kaldım .

Herhangi bir kullanıcı bilgisinin aktarılmasına gerek yoktur. Tarayıcı ve IIS, oturum açmış kullanıcı kimlik bilgilerini değiş tokuş eder ve Web API, isteğe bağlı olarak kullanıcı kimlik bilgilerine erişebilir (IIS'den varsayıyorum).


6

Karan Bhandari'nin cevabı güzel, ancak bir projeye eklenen Hesap Kontrolcüsü büyük olasılıkla a Mvc.Controller. Bir ApiController değişim kullanılmak üzere onun cevabını dönüştürmek için HttpContext.Current.GetOwinContext()için Request.GetOwinContext()ve emin aşağıdaki 2 ekledik yapmak usingifadeleri:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;


3

Asp.Identity UseManager kullanıyorsanız, otomatik olarak

RequestContext.Principal.Identity.GetUserId ()

dayalı IdentityUser oluştururken kullandığımız IdentityDbContext .

Özel bir kullanıcı tablosu ve owin belirteç taşıyıcı kimlik doğrulaması uyguluyorsanız, lütfen cevabımı kontrol edin.

Web API çağrıları sırasında kullanıcı bağlamı nasıl elde edilir?

Umarım yine de yardımcı olur. :)


1
string userName;
string userId;
if (HttpContext.Current != null && HttpContext.Current.User != null 
        && HttpContext.Current.User.Identity.Name != null)
{
    userName = HttpContext.Current.User.Identity.Name;
    userId = HttpContext.Current.User.Identity.GetUserId();
}

Ya da Darrel Miller'ın yorumuna dayanarak, belki bunu önce HttpContext'i almak için kullanabilirsiniz.

// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);    

Ayrıca bakınız:

HTTPContext'e Web API eyleminizden nasıl erişilir?


5
Barındırma seçeneklerinizi sınırlandırdığı ve kodunuzun test edilmesini zorlaştırdığı için HttpContext kullanmayın.
Darrel Miller

Self-host iseniz veya OwinHttpListener barındırıyorsanız HttpContext nesnesi sözlükte olmayacaktır
Darrel Miller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.