2016-10-29 10 views
9

Moje API REST C# są wywoływane z aplikacji internetowej AngularJS. Zabezpieczam Web API poprzez uwierzytelnienie użytkownika i upewnienie się, że użytkownik jest częścią określonej grupy Windows.Bezpieczne udostępnianie interfejsu API REST interfejsu C# do języka skryptowego, takiego jak Python

Teraz klient chciałby wywołać API ze skryptów (Python). Jak mogę to wdrożyć? Czy powinienem po prostu przekazać im nazwę użytkownika i hasło w ramach wywołania json?

+0

Dlaczego nie używać tego samego mechanizmu uwierzytelniania, co w sieci? –

+0

Używam ciasteczek i autoryzacji z innego serwera, który oczekuje tego z przeglądarki. Po prostu nie jest to możliwe –

+2

Nic, z czym nie mogą poradzić sobie biblioteki Pythona. Ale jeśli chcesz, aby było prostsze, protokół HTTP basic auth i openid/OAuth są dość powszechne dla API auth –

Odpowiedz

3

Użyj dokładnie tej samej metody uwierzytelniania, której używasz.

Oto przykład pozbawione zasad przy użyciu python (niesprawdzone):

from requests.auth import HTTPBasicAuth 
s = requests.Session() 

# Make the initial authentication request from a session object 
s.get('https://omg.wtf/user', auth=HTTPBasicAuth('user', 'pass')) 

# All subsequent requests from that session will include any cookies set in the initial response 
r = s.get('http://omg.wtf/911') 
print(r.text) 
+0

Czy można przekierować do skryptu Pythona i ustawić plik cookie? –

+0

co masz na myśli przekierować? plik cookie jest przechowywany w s = requests.Session() zawsze możesz po prostu wysyłać nowe żądania za pomocą pliku cookie/sesji. –

+0

Oryginalny kod programu Tweak @ SeanThorburn, dzięki czemu początkowe żądanie jest również wykonywane z obiektu sesji. Obiekt ten zapamięta wszystkie pliki cookie ustawione w odpowiedzi początkowej i wyśle ​​te wartości cookie w kolejnych żądaniach. –

4

Jeśli można poszerzyć nagłówków w Pythonie łatwo, chciałbym zaproponować, że używasz uwierzytelniania token. Firma Microsoft nie udostępnia tego typu uwierzytelniania bezpośrednio, ale za pośrednictwem projektu OWIN. Nie jest to takie trudne, ale musisz się najpierw nauczyć, jak działają. Istnieje bardzo dobry i wszechstronny samouczek: here.

Zasadniczo otrzymuje się token (ważny przez pewien czas), podając nazwę użytkownika/hasło. Ten token jest zaszyfrowany/podpisany, co oznacza, że ​​twój backend będzie zaufany, bez konieczności sprawdzania nazwy użytkownika/hasła na każdym wniosku (co jest kosztowne). Następnie musisz dodać token do nagłówka Authorization bearer token lub coś podobnego do każdego żądania. Alternatywnie myślę, że możesz mieć token w pliku cookie, aby zachować spójność wstecz, jeśli chcesz.

Proponuję użyć tego samego mechanizmu również w Angular, ponieważ można łatwo dodać tam przechwytywacz i uniknąć potencjalnych problemów z plikami cookie i CSRF.

Powiązane problemy