2010-01-11 3 views
4

Je ne pouvais pas penser à un titre décent, alors laissez-moi d'abord m'excuser pour cela.Contrôler quels WebMethods sont exposés en externe dans un WebService

J'ai un WebService (appelez-le A) écrit pour mon application afin que je puisse tirer parti des fonctionnalités ASP.NET 3.5 AJAX. J'utilise le proxy JavaScript généré pour effectuer des appels AJAX.

Comme un effet secondaire, WebService A est exposé pour quiconque d'ajouter une référence à un autre projet, ce qui est génial, sauf que je ne veux pas certains WebMethods soient disponibles à des applications externes (dans le même domaine, BTW).

J'ai deux questions:

  • est-il un moyen de contrôler l'exposition des WebMethods dans WebService A?

S'il n'y a pas, je pense que je vais juste ajouter un WebService séparé (B) qui expose les WebMethods dont j'ai besoin de WebService A. Mais,

  • Comment puis-je empêcher que d'autres applications de référencement WebService A tout en permettant l'application, il est originaire pour y accéder?

Si ce n'est pas possible, je ne m'inquiète pas vraiment. Les applications sont toutes intranet uniquement, je ne veux tout simplement pas abuser des WebServices.

De plus, il y a déjà une question similaire ici sans bonnes réponses. Le demandeur décrit presque la même situation que je suis: ASP.NET WebService deny remote access

Répondre

1

Pour créer ces services Web publics/privés, vous pouvez placer votre .asmx dans un autre dossier, créer un nouveau fichier web.config et définir vos utilisateurs autorisés dans une section <authorization>. Ce document décrit cette configuration en détail: Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication.

+0

Voici ce que j'ai fini par faire: J'ai ajouté un nouveau projet à ma solution qui contenait le service "externe" et l'ai publié dans un nouvel emplacement afin que je puisse contrôler l'authentification et l'autorisation séparément de mon application principale. –

0

Je créer un service web public et un service privé pour des raisons de sécurité.

+0

Eh bien, à droite, qui est l'idée, mais ** comment ** pour faire un "privé" est ma question . –

+0

Je ne pense pas qu'il existe un moyen de contrôler cela ... – Ariel

0

Vous pouvez utiliser un en-tête SOAP personnalisé dans le service pour exiger que les informations d'identification soient transmises aux méthodes que vous souhaitez protéger. Cela permettrait "d'exposer" les méthodes mais elles seraient inaccessibles. L'application X serait autorisée à accéder à toutes les méthodes car elle serait conçue pour utiliser l'en-tête de sécurité approprié, mais l'application Y se verrait refuser l'accès (bien qu'elle puisse utiliser tous les types/énumérations publics, etc.).

http://msdn.microsoft.com/en-us/library/ms819938.aspx

1

J'utilise un service web standard avec l'authentification par formulaire comme suit:

' ************************************ 
    ' **** Example with Windows Forms **** 
    ' ************************************ 
    ' Taken from http://www.dotnetbips.com/articles/dbd724e9-78f0-4a05-adfb-190d151103b2.aspx 
    ' **** Login ************************* 
    ' Dim x As New localhost.Service1() 
    ' Dim cc As New CookieContainer() 
    ' Dim sessioncookie As Cookie 
    ' Dim cookiecoll As New CookieCollection() 

    ' x.CookieContainer = cc 
    ' x.Login("user1", "password1") 
    ' cookiecoll = x.CookieContainer.GetCookies 
    ' (New Uri("http://localhost")) 
    ' Session("sessioncookie") = cookiecoll("CookieName") 
    ' **** Logout ************************ 
    ' Dim x As New localhost.Service1() 
    ' Dim cc As New System.Net.CookieContainer() 
    ' Dim sessioncookie As New System.Net.Cookie() 
    ' x.CookieContainer = cc 
    ' sessioncookie = CType(Session("sessioncookie"), 
    ' System.Net.Cookie) 
    ' If Not sessioncookie Is Nothing Then 
    ' ' x.CookieContainer.Add(sessioncookie) 
    ' End If 
    ' x.Logout() 
    ' Session.Remove("sessioncookie") 
    ' ************************************ 

    <WebMethod()> _ 
    Public Function Login(ByVal UserName As String, ByVal Password As String) As Boolean 
     If UserName.Length > 0 And Password.Length > 0 Then 
      If FormsAuthentication.Authenticate(UserName, Password) Then 
       FormsAuthentication.SetAuthCookie(UserName, False) 
       Return True 
      End If 
     Else 
      Return False 
     End If 
    End Function 

    Public Sub ValidateAuthentication() 
     If Context.User.Identity.IsAuthenticated = False Then 
      Throw New System.UnauthorizedAccessException("User is not authenticated.") 
     End If 
    End Sub 

    <WebMethod()> _ 
    Public Sub Logout() 
     If Context.User.Identity.IsAuthenticated = True Then 
      FormsAuthentication.SignOut() 
     End If 
    End Sub