控制哪些WebMethods在WebService中外部公开

时间:2010-01-11 17:32:45

标签: asp.net security web-services asp.net-3.5

我想不出一个体面的头衔,所以让我先为此道歉。

我有一个为我的应用程序编写的WebService(称之为 A ),因此我可以利用ASP.NET 3.5 AJAX功能。我使用生成的JavaScript代理来进行AJAX调用。

作为一个副作用,WebService A 公开给任何人作为对另一个项目的引用添加,这很好,除了我不希望某些WebMethods可用于外部应用程序(在相同的域名,BTW)。

所以我有两个问题:

  • 有没有办法控制WebService中WebMethods的曝光 A

如果没有,我想我只会添加一个单独的WebService( B ),从WebService A 公开我需要的WebMethods。但是,

  • 如何阻止其他应用程序引用WebService A ,同时仍然允许其源自的应用程序访问它?

如果那不可能,我真的不担心。这些应用程序都是仅限Intranet的,我只是不希望滥用Web服务。

此外,这里也有一个类似的问题没有任何好的答案。提问者描述了我所处的几乎相同的情况:ASP.NET WebService deny remote access

4 个答案:

答案 0 :(得分:1)

要创建公共/私人网络服务,您可以将.asmx放入另一个文件夹,创建新的web.config文件,并在<authorization>部分内定义您的授权用户。

本文档详细介绍了此配置:Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

答案 1 :(得分:1)

我使用带有表单身份验证的标准Web服务,如下所示:

    ' ************************************
    ' **** 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

答案 2 :(得分:0)

出于安全考虑,我会创建一个公共Web服务和一个私有Web服务。

答案 3 :(得分:0)

您可以在服务中使用自定义SOAP标头,要求将凭据传递给您要保护的方法。这仍然会“暴露”这些方法,但它们将无法访问。应用程序X将被允许访问所有方法,因为它将被设计为使用适当的安全头,但是应用程序Y将被拒绝访问(尽管它可以使用任何公共类型/枚举等)。 / p>

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