2012-09-20 10 views
6

Obecnie mam aplikację internetową MVC, która sprzedaje widżety. Użytkownik loguje się do naszego systemu, korzystając z uwierzytelniania formularzy, a następnie może wykonywać różne funkcje w zależności od grupy, do której przynależy (np. Złożenie zamówienia, wyświetlenie zamówienia, anulowanie zamówienia itp.)..NET WebApi Authentication

Zostaliśmy poproszeni o napisanie Api, które da stronom trzecim możliwość tworzenia i przeglądania zamówień w naszym systemie. Każda strona trzecia będzie miała własną nazwę użytkownika i będzie ograniczona do niektórych metod API w oparciu o grupę, do której należą.

Szukamy możliwości korzystania z Web Api jako mechanizmu dostarczania interfejsu API. Chcielibyśmy również móc wykorzystać ten api z naszej aplikacji internetowej MVC. Niestety, pojawiają się problemy z uwierzytelnianiem dla Web Api. Korzystając z usługi DelegatingHandler, zaimplementowaliśmy uwierzytelnianie podstawowe przez SSL dla naszej WebApi. Działa to doskonale dla naszych stron trzecich. Jednak próbując pobrać Api z naszej aplikacji MVC otrzymujemy błędy odmowy dostępu 401, ponieważ użytkownik został uwierzytelniony w aplikacji MVC za pomocą uwierzytelniania Forms, ale nie mamy możliwości przekazania tych poświadczeń do Web Api. Czy istnieje sposób przekazywania poświadczeń Forms Auth z naszej aplikacji MVC do aplikacji Web api?

IIS konfiguracja WebSite nazwie WidgetStore z dwóch aplikacji internetowych

  • WidgetStore \ UI wykorzystywany jest uwierzytelnianie formularzy
  • WidgetStore \ Api - wykorzystuje uwierzytelnianie podstawowe
+0

Aby rozwiązać problem z formularzem/podstawowym autem, zasugeruję przeczytanie tego wspaniałego artykułu od Dominika Baiera: [Forms/Basic auth claim transformation] (http://leastprivilege.com/2012/10/24/ rozszerzenia-do-strony-apimvc-formsbasic-auth-sample-claim-transformation-and-ajax /) – Swell

Odpowiedz

9

Czy istnieje sposób, aby przekazać dane uwierzytelniające Forms Auth z naszej aplikacji MVC do naszej aplikacji Web api?

Jasne, weźmy na przykład następujące działania kontrolera MVC wywołanie API Web:

[Authorize] 
public ActionResult CallWebApi() 
{ 
    var baseAddress = new Uri("https://example.com"); 
    var cookieContainer = new CookieContainer(); 
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) 
    { 
     var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName].Value; 
     cookieContainer.Add(baseAddress, new Cookie(FormsAuthentication.FormsCookieName, authCookie)); 
     var result = client.GetAsync("/api/values").Result; 
     result.EnsureSuccessStatusCode(); 

     // now you can read the result.Content ... 
    } 
} 

ta zakłada, że ​​masz również włączone uwierzytelnianie formularzy w pliku web.config swojego projektu Web API i że nazwa pliku cookie jest taka sama, jak nazwa użyta w projekcie MVC.

+0

Dziękuję za odpowiedź. Ale jeśli włączę FormsAuthentication w web.config mojego projektu Web API, strony trzecie nie będą mogły się uwierzytelnić. Używają uwierzytelniania BASIC do łączenia się z WebApi i nie będzie już działać. Strony trzecie nie będą miały ciasteczka FormsAuth. – user1686249

+0

Ale jak wygląda Twój wygląd podstawowych handlerów autoryzujących formularze? Jeśli wygląda na to, nie będziesz mieć problemów z włączaniem uwierzytelniania formularzy: http://stackoverflow.com/a/11536349/29407 –