我想不出一个体面的头衔,所以让我先为此道歉。
我有一个为我的应用程序编写的WebService(称之为 A ),因此我可以利用ASP.NET 3.5 AJAX功能。我使用生成的JavaScript代理来进行AJAX调用。
作为一个副作用,WebService A 公开给任何人作为对另一个项目的引用添加,这很好,除了我不希望某些WebMethods可用于外部应用程序(在相同的域名,BTW)。
所以我有两个问题:
如果没有,我想我只会添加一个单独的WebService( B ),从WebService A 公开我需要的WebMethods。但是,
如果那不可能,我真的不担心。这些应用程序都是仅限Intranet的,我只是不希望滥用Web服务。
此外,这里也有一个类似的问题没有任何好的答案。提问者描述了我所处的几乎相同的情况:ASP.NET WebService deny remote access
答案 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>