2017-08-09 15 views
6

Ten kod w moim interfejsie API sieci Web potwierdza, że ​​jestem uwierzytelnionym użytkownikiem, ale nie otrzymuję nazwy użytkownika, zamiast tego otrzymuję nazwę puli aplikacji. Jak to naprawić?Dlaczego nie otrzymuję mojej nazwy użytkownika w uwierzytelnianym przez okno interfejsie Web Core API?

var testa = User.Identity.GetType(); 
NLogger.Info($"testa = {testa}"); 
var testd = User.Identity.IsAuthenticated; 
NLogger.Info($"testd = {testd}"); 
var loggedInUser = User.Identity.Name; 
NLogger.Info($"loggedInUser = {loggedInUser}"); 

W moim pliku dziennika otrzymuję;

testa = System.Security.Principal.WindowsIdentity 
testd = True 
loggedInUser = IIS APPPOOL\SIR.WEBUI 

Używam znacznika [Autoryzuj] dla kontrolera i anonimowe uwierzytelnianie jest wyłączone.

Cóż, nazywam tę metodę z Listonosza, działa poprawnie, LoggedInUser jest poprawny. Ale kiedy zadzwonię z mojego kodu, otrzymam nieprawidłowy loggedInUser pokazany powyżej. Kod, którego używam do wywoływania aplikacji webowej z mojej aplikacji klienckiej;

public static async Task<IEnumerable<ContractDto>> GetAllForUser() 
{ 
    using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true })) 
    { 
     client.BaseAddress = new Uri(AppSettings.ServerPathApi); 
     var path = GetPath("getallforuser"); 
     var response = await client.GetAsync(path); 
     response.EnsureSuccessStatusCode(); 
     var stringResult = await response.Content.ReadAsStringAsync(); 
     return JsonConvert.DeserializeObject<IEnumerable<ContractDto>>(stringResult); 
    } 
} 

W IIS ustawiłem typ puli aplikacji na wszystkie różne opcje; applicationpoolidentity, networkservice, localservice, system lokalny i testował aplikację za każdym razem. Czego właściwie mi brakuje?

+0

accept odpowiedź na podobnym problemie tutaj https://stackoverflow.com/a/12675503/5233410 – Nkosi

+0

nie jestem pewien jeśli to jest problem, ale proponuję, aby ustawić "Załaduj profil użytkownika" na true, jeśli jeszcze nie, w IIS – Shahbaz

+0

@Nkosi, próbowałem, ale to nie działa. Używam interfejsu Web Core API i myślę, że podszywanie się działa inaczej. Może powinienem używać personifikacji? Ale nie muszę tego robić, gdy używam AJAX, dlaczego więc C# powinien być inny? – arame3333

Odpowiedz

0

Spróbuj

if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated) 
{ 
    string username = System.Web.HttpContext.Current.User.Identity.Name; 
} 

lub można spróbować

var user = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity; 
var userName = user.Impersonate(); 
+0

Po wykonaniu pewnych badań dowiedziałem się, że połączenie z AJAX przeniesie moją tożsamość z przeglądarki, ale za pośrednictwem IIS zajmie pulę aplikacji. Rozwiązaniem dla IIS jest użycie podszywania się i teraz się nad tym zastanawiam. – arame3333

+0

@ arame3333 Jeśli chcesz dodać podszywanie użyj drugiego kodu, ale dodaj tę część var ​​userName = user.Impersonate(). zredagowałem odpowiedź, aby dołączyć to: –

+0

@ arame3333 możesz sprawdzić ten link, istnieje podobne pytanie tutaj [Uzyskaj referencje z prośbą] (https://stackoverflow.com/questions/12212116/how-to-get-httpclient-to -passentials-along-with-the-request/12675503 # 12675503) –

Powiązane problemy