2014-09-12 10 views
9

Mam projekt Web API, który zapewnia dostęp tylko do Autoryzowanych użytkowników na podstawie ról. Planujemy skalować do wielu takich projektów API w niedalekiej przyszłości, które będą korzystać z tego samego tokena autoryzacji. Używam osobnego projektu, który uwierzytelnia użytkownika (używając Facebooka, Google lub ActiveDirectory lub innego dostawcy uwierzytelniania), a następnie generuje token autoryzacji, który jest zużywany przez wszystkie serwery API. Aby włączyć odszyfrowywanie tokena, udostępniam klucz komputera przez web.config pośród wszystkich aplikacji. To działa dobrze. Teraz chciałbym zmienić MachineKey co jakiś czas i udostępnić go wszystkim aplikacjom wykorzystującym token autoryzacji.Autoryzuj WebAPI na wielu maszynach przy użyciu SSO za pośrednictwem kodu

  1. Jak zaktualizować klucz maszynowy w czasie wykonywania spośród wszystkich aplikacji ?
  2. Czy istnieje programowy sposób osiągnięcia tego samego?
  3. Przeczytałem na blogu, że aktualizacja klucza MachineKey nie jest dobrą praktyką. Jeśli tak, to w jaki sposób uniknąć całkowitego użycia klucza komputera i utworzyć system, w którym klucz nie jest statyczny?

Mój pomysł polega na oddzieleniu projektu autoryzacji od moich projektów WebAPI, tak aby nie wdrażać systemu uwierzytelniania we wszystkich projektach WebAPI. Wszelkie wskazówki byłyby bardzo pomocne.

Odpowiedz

4

Extended the implementation przedstawione na następującej odpowiedzi stackoverflow, aby spełnić Twoje wymagania. W ciągu kilku dni zaktualizuję kod, w jaki sposób można to osiągnąć.

+0

Dzięki, wydaje się to obiecującą przewagą! – Shouvik

0

Możesz pozwolić aplikacjom API poprosić usługę autoryzacji o potwierdzenie tokena od klienta i w tym samym żądaniu pobrać dane ID z usługi do interfejsu API. Aby ograniczyć ruch do Auth-Service, może on rozdawać krótkotrwałe Tokeny dostępu do API z datą ważności, która musi zostać odświeżona po kilku minutach, lub jeśli są krytyczne, może zostać odwołana bezpośrednio z poziomu Auth-Service wywołuje interfejsy API.

Twój system brzmi dla mnie bardzo podobnie do schematu OAuth. Nie sugerowałbym, aby próbować osiągnąć pełną zgodność, chyba że planujesz inne przypadki użycia, takie jak urządzenia mobilne itp., Uzyskujące dostęp do twoich usług, ale możesz przeczytać, jak to robią i wdrożyć to, co wydaje się odpowiednie dla twoich potrzeb.

+0

I zostały uznane za implementację i już architekturę rozwiązania w podobny sposób. Chodzi o to, że jestem zainteresowany wykorzystaniem systemu uwierzytelniania opartego na systemie Windows do zarządzania moją autoryzacją. W ten sposób mogę używać atrybutu "[Authorize]" w interfejsie API sieci Web bez większych zmian w moich projektach interfejsu API. Obecnie dzielę się systemem 'machineKey' mojego systemu generowania tokenów z projektami API. W ten sposób nie ma potrzeby weryfikowania tokena z serwera autoryzacji. Chcę tylko dynamicznie zmieniać klucz MachineKey, aby nie był statyczny. – Shouvik

0

Jak sugeruje Rajesh, uważam, że to, czego szukam, to trywialne ulepszenie jego linku. Zasadniczo potrzebuję utworzyć funkcję, która ustawia mój klucz w metodzie Protect.

private IDataProtector protector; 

public string Protect(AuthenticationTicket ticket) 
{ 
    protector = new AesDataProtectorProvider(functionGenerateKey()); 
    //functionGenerateKey is a function that generates a new key and informs 
    //the subscribers to avail new key 
    var ticketData = this.serializer.Serialize(ticket); 
    var protectedData = this.protector.Protect(ticketData); 
    var protectedString = this.encoder.Encode(protectedData); 
    return protectedString; 
} 

public SecureTokenFormatter(string key) 
{ 
    this.serializer = new TicketSerializer(); 
    //this.protector = new AesDataProtectorProvider(key); -> Remove the initialization of this protector as I am doing it in the above function. 
    this.encoder = TextEncodings.Base64Url; 
} 

Reszta realizacji jest dość standardowy kod napisany przez Barguast