Nota prawna: Zacznę od stwierdzenia, że jestem nowy w MVC4 + Web Api + Web Services ogólnie + JQuery. Mogę atakować to pod niewłaściwym kątem.Równolegle uwierzytelnianie podstawowe i formularzy za pomocą interfejsu ASP.NET Web API
Próbuję utworzyć aplikację Web MVC + Web API w języku C# dla platformy .NET 4 w celu wdrożenia na platformie Azure. Interfejs API będzie używany przez klientów mobilnych (iOS, przy użyciu pakietu RestKit).
Aplikacja internetowa MVC będzie stosunkowo prosta. Chcielibyśmy skorzystać z uwierzytelniania formularzy dla niego i SimpleMembership - które osiągnęliśmy i działa dobrze.
Będziemy używać metod Web API ze skryptów JQuery (Knockout) do wypełniania fragmentów stron internetowych. Dlatego oczekujemy, że JQuery użyje tej samej tożsamości uwierzytelnianej przez Uwierzytelnianie za pomocą formularzy.
Jednak pomysł jest taki, że Web Api może być wywoływany bezpośrednio przez klientów mobilnych. Brak uwierzytelnień formularzy dla tych.
Szukaliśmy Thinktecture Identity Model (http://nuget.org/packages/Thinktecture.IdentityModelhttps://github.com/thinktecture/Thinktecture.IdentityModel.40). Dodaliśmy programy obsługi BasicAuth i AcessKey do konfiguracji i działa (zobacz poniższy kod).
Podczas próby uzyskania dostępu do webapi bez uwierzytelnienia przeglądarka wyświetla podstawowe okno dialogowe uwierzytelniania i działa zgodnie z oczekiwaniami.
"Problem" polega na tym, że gdy jesteś już zalogowany przy użyciu uwierzytelniania za pomocą formularzy i próbujesz wywołać metodę Web Api, nadal uzyskujesz okno dialogowe Basic Authentication. Innymi słowy, Thinktecture IdentityModel wydaje się zignorować w pełni uwierzytelnianie formularzy.
Moje pytania są następujące:
- Czy moje oczekiwania są prawidłowe? że po przeprowadzeniu uwierzytelniania formularzy nie powinienem robić nic więcej, aby skrypty JQuery itp. uzyskiwały dostęp do interfejsu Web API z tej samej sesji użytkownika przeglądarki.
- Jak to naprawić?
- Jeśli moje oczekiwania nie są prawidłowe; jak to ma działać? tj: jak dokonać uwierzytelnienia skryptów JQuery?
Wiem, że w Stackoverflow jest mnóstwo podobnych pytań, szczerze mówiąc wyglądałem dużo, widziałem filmy itp., Ale albo brakuje mi czegoś oczywistego, albo nie ma jasnej dokumentacji o tym dla kogoś nowego w technologie.
Doceniam pomoc. Dzięki.
public static AuthenticationConfiguration CreateConfiguration()
{
var config = new AuthenticationConfiguration
{
DefaultAuthenticationScheme = "Basic",
EnableSessionToken = true,
SetNoRedirectMarker = true
};
config.AddBasicAuthentication((userName, password) => userName == password, retainPassword: false);
config.AddAccessKey(token =>
{
if (ObfuscatingComparer.IsEqual(token, "accesskey123"))
{
return Principal.Create("Custom",
new Claim("customerid", "123"),
new Claim("email", "[email protected]"));
}
return null;
}, AuthenticationOptions.ForQueryString("key"));
Witam, jest dobrze. Skąd jednak pochodzi interfejs "IMembershipService"? (nie wydaje się częścią WebAPIDoongle ani standardowego MVC .NET4). Zauważ, że twoja klasa działa, chciałbym, aby ta sama klasa obsługiwała również klawisze API, ale wierzę, że mogę dodać tę funkcję. Moim głównym problemem jest teraz, jak używać klasy "WebSecurity" do sprawdzania poprawności użytkownika względem bazy danych i zwracania dyrektora (mogę zrobić WebSecurity.Login, ale to jest kiepskie). – rufo
BTW: podczas testowania z przeglądarki (przeglądarki Chrome) przeglądarka nie wymusza podstawowego uwierzytelniania, jeśli użytkownik nie jest zalogowany. Chociaż nie jest to konieczne dla moich klientów mobilnych, jest to wygodne do testowania. Też to sprawdzę. – rufo
@rufo IMembershipService to moja własna implementacja. Położyłem to tam, żebyś wpadł na pomysł. Możesz zastąpić to za pomocą własnego imp. – tugberk