Jak skonfigurować bezpieczne usługi RESTful za pomocą WCF przy użyciu nazwy użytkownika/hasła + SSL

Chcę napisać plik konfiguracyjny, który pozwala na RESTful services w WCF, ale nadal chcę mieć możliwość "podłączenia" dostawcy członkostwa do uwierzytelniania nazwy użytkownika/hasła.

Poniżej znajduje się część mojej bieżącej konfiguracji przy użyciu wiązania basicHttp lub wsHttp w / out WS Security, jak to zmieni się w / REST based services?

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
                </security>
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding name="basicHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
Author: Toran Billups, 2008-09-26

7 answers

Oto podcast o zabezpieczeniu WCF REST services z ASP.net dostawca członkostwa:

Http://channel9.msdn.com/posts/rojacobs/endpointtv-Securing-RESTful-services-with-ASPNET-Membership/

 3
Author: denis phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-04 14:30:07

Zgadzam się z Darrelem, że złożone scenariusze odpoczynku nad WCF to zły pomysł. To po prostu nie jest ładne.

Jednak Dominick Baier ma kilkadobrych postów o tym na swoim blogu o najmniejszych przywilejach.

Jeśli chcesz zobaczyć obsługę uwierzytelniania WSSE z funkcją fallback to FormsAuthenticationTicket support NA WCF, sprawdź kod źródłowy BlogService.

 2
Author: JarrettV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 15:23:51

Zanim przejdziesz dalej tą ścieżką walki o zaimplementowanie odpoczynku nad WCF, sugeruję przeczytanie tego postu Tima Ewalda. Szczególnie wpłynęło na mnie następujące stwierdzenie:

Nie jestem pewien czy chcę budować na warstwa zaprojektowana do włączenia HTTP w wierzchnią warstwę, która została zaprojektowana do zastanów się.

Spędziłem ostatnie 12 miesięcy rozwijając rzeczy oparte na odpoczynku z WCF i to stwierdzenie okazało się być tak prawdziwe w kółko. IMHO to, co WCF wnosi do stołu, przewyższa złożoność, jaką wprowadza do wykonywania pracy w spoczynku.

 1
Author: Darrel Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-27 14:50:32

Niezależnie od tego, czy społeczność ma opinie przeciwko REST na WCF (ja osobiście jestem na ogrodzeniu) Microsoft zrobił na nim zamach, http://msdn.microsoft.com/en-us/netframework/cc950529.aspx

 1
Author: MotoWilliams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 19:06:45

Tak zgadzam się z Moto, link z WCF Starter Kit jest najbliższą rzeczą, jaką widziałem do uwierzytelniania poświadczeń za pomocą niestandardowego nagłówka HTTP ( http://msdn.microsoft.com/en-us/library/dd203052.aspx).

Jednak nie udało mi się uzyskać przykładu.

 1
Author: GONeale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-05 01:22:41
 1
Author: Elijah Glover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-22 09:49:13

UPDATE 01/23/2012

Odkąd napisałem to pytanie, widziałem znacznie lepsze podejście do zabezpieczenia odpoczynku jak usługi internetowe w dziczy. Brzmiało to skomplikowanie, gdy po raz pierwszy o tym usłyszałem, ale pomysł jest prosty i w całej sieci zarówno dla usług internetowych, jak i innej bezpiecznej komunikacji.

Wymaga użycia kluczy publicznych / prywatnych.

1.) każdy użytkownik (klient) punktu końcowego będzie musiał zarejestrować się w usłudze REST web]}

  • a.) dajesz temu użytkownikowi klucz prywatny, który nie powinien być współdzielony z anyone
  • b.) generujesz również klucz publiczny, który może przejść przez przewód w razie potrzeby w postaci zwykłego tekstu (będzie to również używane do identyfikacji klienta)

2.) każde żądanie użytkownika musi wygenerować hash do podpisania żądania

    Na przykład: klucz prywatny + znacznik czasu + zakodowany ładunek (jeśli jest wystarczająco mały, jak na przykład prosta informacja o użytkowniku, która ma być zaktualizowana)
  • b.) bierzesz te 3 (lub cokolwiek postanowiłeś) i wygenerować 1 way hash (używając na przykład hmac)
  • c.) w żądaniu wysyłanym przez przewód należy podać klucz publiczny (aby strona serwera wiedziała, kto próbuje wysłać to żądanie), hash, który został wygenerowany z kluczem prywatnym oraz znacznik czasu.

3.) punkt końcowy serwera (twoja metoda REST) będzie musiał wygenerować hash przy użyciu tych samych danych wejściowych użytych w kliencie. Ten krok udowodni, że zarówno klient, jak i serwer znali prywatną klucz pasujący do klucza publicznego przekazany wraz z żądaniem. (to z kolei oznacza, że użytkownik wysyłający żądanie jest legalny, ponieważ nikt inny nie mógł znać klucza prywatnego)

  • A.) wyszukuje klucz prywatny klienta według klucza publicznego przekazywanego podczas żądania

  • B.) weź inne paramy (znacznik czasu i zakodowany ładunek) wraz z kluczem prywatnym znalezionym w poprzednim kroku i użyj tego samego algorytmu, aby wygenerować 1 way hash (ponownie HMAC jest to, co widziałem w świecie rzeczywistym)

  • W związku z tym, że nie jest to możliwe, nie jest to możliwe, ponieważ nie jest to możliwe, ponieważ nie jest to możliwe.]}
 1
Author: Toran Billups,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-24 02:58:27