2013-07-07 13 views
6

Chcę używać usług sieciowych z Ajax. Jaki jest najlepszy sposób na bezpieczeństwo podczas wywoływania usługi internetowej za pomocą ajax? Chcę chronić przed zdalnym wywołaniem aplikacji.Asp.net WebService - Bezpieczne wywołanie usługi internetowej z jquery AJAX

Mam następujący usługa na przykład:

[WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    [System.Web.Script.Services.ScriptService] 
    public class Users : System.Web.Services.WebService 
    { 

     [WebMethod] 
     public List<User> GetUsers() 
     { 
      List<User> listUsers = new List<User>(); 
      User user = new User(); 
      user.Id = 1; 
      user.Name = "John"; 

      User user2 = new User(); 
      user2.Id = 2; 
      user2.Name = "Martin"; 


      listUsers.Add(user); 
      listUsers.Add(user2); 

      return listUsers; 
     } 
    } 
} 

nazywam usługa z jquery ajax:

<script type="text/javascript"> 
    $(function() { 

     getUsers(); 


     function getUsers() { 

      $.ajax({ 
       type: "POST", 

       url: "Webservices/Users.asmx/GetUsers", 

       data: "{}", 

       contentType: "application/json; charset=utf-8", 

       dataType: "json", 

       success: function (response) { 

        var users = response.d; 

        $.each(users, function (index, user) { 

         console.log(user.Name); 

        }); 

       }, 

       failure: function (msg) { 
       } 
      }); 
     } 
    }); 
</script> 
+0

Jaki jest aplikacją, która wywołuje usługę internetową? ASP.NET Web Forms, MVC? Czy .asmx jest częścią tej samej aplikacji? W jaki sposób aplikacja internetowa, która wywołuje .asmx jest zabezpieczona? Czy używasz do tego uwierzytelniania formularzy? – Badri

+0

@Badri - Dziękuję za pytania. Używam formularzy sieciowych ASP.NET. Asmx jest w tej samej aplikacji. Robię aplikację do czatu i chcę użyć usługi sieciowej do zapisania wiadomości i pobrania nowej wiadomości. Chcę zrobić bezpieczne usługi internetowe do wysyłania wiadomości na czacie. Czat może korzystać tylko z zarejestrowanego użytkownika. Do uwierzytelnienia chcę użyć uwierzytelniania formularza. – Jenan

Odpowiedz

9

Nie ma czegoś takiego jak najlepszy sposób, a odpowiedź jest zawsze it depends, choć jest to bardzo pomocne. Możesz użyć na przykład forms authentication. Jeśli aplikacja internetowa korzystająca z usługi internetowej i usługi sieciowej jest częścią tego samego ASP.NET application, przeglądarka może bezproblemowo wysłać bilet uwierzytelniania formularzy (cookie) dla każdego połączenia z usługą sieciową.

w pliku konfiguracyjnym, można mieć

<authorization> 
     <deny users="?" /> 
</authorization> 

Spowoduje to zablokowanie dostępu do anonimowych użytkowników i który obejmie usług internetowych, jak również. Innymi słowy, dopóki użytkownik nie zaloguje się i nie otrzyma ważnego pliku cookie z biletem, usługa nie może być używana. Oczywiście, musisz HTTPS. W przeciwnym razie każdy w środku może pobrać plik cookie w nagłówkach i zadzwonić do usługi.

Wreszcie, nie można zagwarantować, że nikt nie będzie dzwonił do usługi internetowej poza Twoją aplikacją w absolutnym sensie. Powyższe podejście gwarantuje, że żaden w środku nie zadzwoni do Twojej usługi. Ale nie ma sposobu, aby upewnić się, że ważny użytkownik wywołuje usługę bezpośrednio poza aplikacją, ponieważ osoba wywołująca usługi WWW jest JavaScriptem, a wszelkie zabezpieczenia, które budujesz w JavaScript, mogą być łatwo wykryte przez użytkownika, patrząc na skrypt lub nawet patrząc na ruch z przeglądarki i do przeglądarki. Każdy użytkownik końcowy, który jest nieco techniczny, będzie mógł odtwarzać żądania lub modyfikować żądania i przesyłać je do usługi sieciowej przy użyciu prawidłowych poświadczeń.

EDIT: -

Oto więcej szczegółów szukasz włączyć FormsAuthentication.

(1) W , pod <system.web>, upewnij się, że to masz.

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" defaultUrl="~/" /> 
</authentication> 
<authorization> 
    <deny users="?" /> 
</authorization> 

Zapewni to przekierowanie wszystkich nieuwierzytelnionych (anonimowych) użytkowników do Login.aspx.

(2) Wprowadź Login.aspx z logiką logowania, aby uzyskać identyfikator użytkownika i hasło i sprawdź je w bazie danych. Po pomyślnym uwierzytelnieniu, to znaczy, że wprowadzony przez użytkownika identyfikator i hasło pasują do tego, co masz w bazie danych, mogą znajdować się w przycisku obsługi przycisku kliknięcia, ustawić bilet.

protected void Button1_Click(object sender, EventArgs e) 
{ 
    // Do all your login logic here 
    // once user ID and password entered by the user are okay, call this 

    string ticket = FormsAuthentication.Encrypt(
         new FormsAuthenticationTicket("userId", false, 15)); 
    HttpCookie FormsCookie = new HttpCookie(
       FormsAuthentication.FormsCookieName, ticket) { HttpOnly = true }; 
    HttpContext.Current.Response.Cookies.Add(FormsCookie); 
} 

(3) Dodaj PrincipalPermissionAttribute sposobu internetowych, takich jak to.

public class Users : System.Web.Services.WebService 
{ 
    [PrincipalPermissionAttribute(SecurityAction.Demand)] 
    [WebMethod] 
    public List<User> GetUsers() 
    { 
     // Same code as what you have now 
    } 
} 

Jeśli teraz przejść do dowolnej strony, użytkownik zostanie przekierowany do Login.aspx gdzie trzeba będzie wprowadzić nazwę użytkownika i hasło i login. Podczas logowania plik cookie uwierzytelniania formularzy zostanie utworzony i zapisany w odpowiedzi.Od tej chwili wszystkie wnioski do twojej aplikacji będą zawierały plik cookie (przeglądarka zrobi to za Ciebie). Bez logowania się, jeśli przejdziesz bezpośrednio do serwisu internetowego, nadal będziesz przekierowywany na stronę logowania. Jak już wspomniałem w mojej oryginalnej odpowiedzi, zalogowany użytkownik nadal będzie mógł uzyskać bezpośredni dostęp do usługi sieciowej. Jeśli JavaScript może coś zrobić, użytkownik może zrobić to samo.

BTW, usługi sieciowe (asmx) to przestarzała technologia.

+0

Jaki typ jest teraz używany zamiast asmx? – Jenan

+0

Bardzo dziękuję za wspaniałe przypomnienie - "usługi internetowe (asmx) to przestarzała technologia". Używam usługi WCF. Czy możesz edytować swoją odpowiedź na korzystanie z usługi wcf? Dziękuję Ci. – Jenan

+0

Moja odpowiedź będzie taka sama dla WCF, jak również. Dla pt. # 3, zamiast stosowania '[PrincipalPermissionAttribute (SecurityAction.Popyt)] 'w metodzie webowej, zastosuj to samo w metodzie klasy, która implementuje kontrakt serwisowy WCF. Zamiast WCF, jeśli planujesz używać ASP.NET Web API, który jest f/w do budowania usług HTTP, nawet wtedy to samo podejście zadziała. Web API udostępnia atrybut 'Authorize', którego można używać zamiast' PrincipalPermission', ale zasadniczo chodzi o deklaratywne sprawdzanie, czy istnieje uwierzytelniona tożsamość powiązana z bieżącą nazwą użytkownika. – Badri

1

Jedną z rzeczy, które można zrobić, aby zapobiec wywoływaniom poza przeglądarką, jest umieszczenie tokena jednorazowego użytku na stronie podczas jego budowania, a następnie opublikowanie go podczas połączenia AJAX. Prostą implementacją byłaby tabela bazy danych z mnóstwem losowych wartości (może 32-alfanumerycznych lub podobnych). Gdy tworzysz stronę, pobierz jedną z wartości z tabeli i umieść ją na swojej stronie - gdy umieścisz formularz formularza AJAX, uwzględnij tę wartość.

Po stronie serwera upewnij się, że wartość istnieje w tabeli, a następnie usuń ją z tabeli.

Jeśli ta usługa zostanie ponownie wywołana z tą wartością, nie powiedzie się, ponieważ wartość nie znajduje się już w tabeli.

Oznacza to, że aby wygenerować ważny token, należy najpierw pobrać stronę, a następnie można jej użyć tylko jeden raz.

Można wprowadzić dodatkowe kontrole, takie jak adres IP, agent użytkownika, wartości plików cookie, daty wygaśnięcia itd., A także takie czynności, jak wartości mieszania z tajnym kluczem lub inne metody zabezpieczania przez zaciemnienie.

W końcu jednak, jak wskazuje Badri, wszystko może zostać sfałszowane, jeśli ktoś naprawdę chce, po prostu ręcznie tworząc żądanie HTTP, które przeglądarka ma zamiar wykonać dla wywołania AJAX. Najlepsze, co możesz zrobić, to upewnić się, że tylko poprawni użytkownicy mogą zadzwonić do usługi (niezależnie od technologii klienta, z której korzystają), a to odbywa się poprzez tradycyjne uwierzytelnianie formularzy.

2

To bardzo ważny temat do dyskusji. Istnieje wiele sposobów na zrobienie tego.

Osobiście używamy Service Stack dla API i używamy klucza, gdy mamy dostęp do API. Klucz to przewodnik, który pozostaje taki sam dla klienta i serwera. Jeśli klient i serwer to ten sam system, nie będzie problemów z publikowaniem klucza.

bardzo szczegółowe sposoby, aby zabezpieczyć Podane tu http://www.stormpath.com/blog/secure-your-rest-api-right-way http://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/

Również kolejny przykład Building Secure Public API with PHP/MYSQL

Powiązane problemy