[ASP.NET]Windows 驗證和授權進行webservice操作
發表於 : 2008年 11月 26日, 03:02
安全性和 WebServices
轉貼自: http://cht.gotdotnet.com/quickstart/asp ... vices.aspx
安全性和 WebServices
Windows 驗證和授權
自訂的驗證和授權 (使用 Soap 標頭)
章節摘要
--------------------------------------------------------------------------------
這個章節描述設定 XML Web Services 安全性的方法。如果您尚未讀過這個教學課程的安全性章節,請在繼續這個主題前,花一些時間來閱讀。
Windows 驗證和授權
您用 Windows 驗證 (Authentication) 來保護 XML Web Services 的安全,這項技術與用來保護 .aspx 網頁的技術相同 (在 Windows 架構驗證章節中有描述)。若需要驗證,請為您的應用程式啟用整合式 Windows 驗證,並停用 IIS 管理主控台中的匿名存取。若要允許或拒絕特定的使用者存取您的服務,請使用 ASP.NET 組態系統或在服務檔案本身上設定 ACL,如下列範例所示:
<configuration>
<system.web>
<authentication mode="Windows"/>
</system.web>
<location path="secureservice.asmx">
<system.web>
<authorization>
<allow users="Administrator"/>
<allow users="DOMAINBradley"/>
<deny roles="BUILTINPower Users"/>
</authorization>
</system.web>
</location>
</configuration>
當您知道 XML Web Services 的用戶端會以特定的 Windows 使用者來執行時,這種方法很有效。一種有趣的情形是用戶端以某使用者來執行,但卻代表另一使用者來進行動作。請考慮存取安全 XML Web Services 的 ASP.NET 網頁,該網頁不會模擬存取網頁的用戶端。在這種情形下,您應以程式設計的方式,在連接到 Web 服務前,設定使用者名稱和密碼。下列的範例使用基本驗證,並描述簡單的 WebService:
<%@ WebService language="C#" Class="SecureService" %>
using System.Web.Services;
using System;
class SecureService : WebService {
[WebMethod]
public String SecureTest() {
return "Hello from the secure web service";
}
}
<%@ WebService language="VB" Class="SecureService" %>
Imports System.Web.Services
Imports System
Class SecureService : Inherits WebService
<WebMethod()> Public Function SecureTest As String
Return "Hello from the secure web service"
End
End Class
<%@ WebService language="JScript" Class="SecureService" %>
import System.Web.Services;
import System;
class SecureService extends WebService {
WebMethodAttribute function SecureTest() : String {
return "Hello from the secure web service";
}
}
C# VB JScript
如下所示,您可在 IIS 中進行適當的設定,為這項服務使用必要的基本驗證:
開啟 IIS MMC 主控台。
Start->Run "inetmgr"
在左方的窗格中,展開樹狀結構來尋找虛擬目錄。
在右方的窗格中,用滑鼠右鍵按一下 [Secureservice.asmx],然後選擇 [內容]。
選取 [檔案安全設定] 索引標籤。在 [匿名存取及驗證控制] 下按一下 [編輯]。
停用匿名存取。
停用整合的 Windows 驗證。
啟用基本驗證。
按一下 [確定] 來儲存這些設定,並結束 MMC 主控台。
基底 WebService Proxy 類別提供兩種屬性:Username 和 Password,您可以用它們來指定連接到遠端 Web 服務時所用的憑證。這些必須設定成 Web 服務的電腦或網域上有效的 Windows 憑證。
<%@ Import Namespace="SecureService" %>
<html>
<script language="C#" runat="server">
public void Page_Load(Object sender, EventArgs e) {
SecureService s = new SecureService();
s.Credentials = new System.Net.NetworkCredential("Administrator", "test123");
Message.Text = s.SecureTest();
}
</script>
<body>
<h4><font face="verdana">
<asp:Label id="Message" runat="server"/>
</font></h4>
</body>
</html>
<%@ Import Namespace="SecureService" %>
<html>
<script language="VB" runat="server">
Public Sub Page_Load(sender As Object, e As EventArgs)
Dim s As New SecureService
s.Credentials = New System.Net.NetworkCredential("Administrator", "test123")
Message.Text = s.SecureTest()
End Sub
</script>
<body>
<h4><font face="verdana">
<asp:Label id="Message" runat="server"/>
</font></h4>
</body>
</html>
<%@ Import Namespace="SecureService" %>
<html>
<script language="JScript" runat="server">
public function Page_Load(sender : Object, e : EventArgs) {
SecureService s = new SecureService();
s.Credentials = new System.Net.NetworkCredential("Administrator", "test123");
Message.Text = s.SecureTest();
}
</script>
<body>
<h4><font face="verdana">
<asp:Label id="Message" runat="server"/>
</font></h4>
</body>
</html>
C# VB JScript
基底 WebService 類別還提供 System.Security.Principal.IPrincipal 型別的 User 屬性,您可用它來擷取用戶端使用者的相關資訊。同樣地,您可以使用 ASP.NET 組態系統中的 Authorization 區段來授權對 Web 服務的存取。
自訂的驗證和授權 (使用 Soap 標頭)
Windows 驗證對 Intranet 案例而言很適合,在這種情形中,您是對自己網域中的使用者來進行驗證。但在網際網路上,您就可能需要依據 SQL 資料庫來執行自訂的驗證和授權。在這種情形中,您應該將自訂的憑證 (例如使用者名稱和密碼) 傳遞至服務,並讓它自行處理驗證和授權。
若要在傳遞要求至 XML Web Services 時附加資訊,SOAP 標頭是一種簡單的方式。若要執行這項作業,請在服務中定義衍生自 SOAPHeader 的類別,然後再將服務的公用 (Public) 欄位宣告成該型別。這會公開在服務的公用合約中,並在 Proxy 從 WebServiceUtil.exe 建立時,提供給用戶端使用,如下所示:
using System.Web.Services;
using System.Web.Services.Protocols;
// AuthHeader class extends from SoapHeader
public class AuthHeader : SoapHeader {
public string Username;
public string Password;
}
public class HeaderService : WebService {
public AuthHeader sHeader;
...
}
Imports System.Web.Services
Imports System.Web.Services.Protocols
' AuthHeader class extends from SoapHeader
Public Class AuthHeader : Inherits SoapHeader
Public Username As String
Public Password As String
End Class
Public Class HeaderService : Inherits WebService
Public sHeader As AuthHeader
...
End Class
import System.Web.Services;
import System.Web.Services.Protocols;
// AuthHeader class extends from SoapHeader
public class AuthHeader extends SoapHeader {
public var Username:String;
public var Password:String;
}
public class HeaderService extends WebService {
public var sHeader:AuthHeader;
...
}
C# VB JScript
服務中的每個 WebMethod 都可使用 SoapHeader 自訂屬性定義一組相關的標頭。依預設值,標頭是必要的,但您也可以定義選擇性的標頭。SoapHeader 屬性指定公用欄位的名稱,或 Client 或 Server 類別的屬性 (在這個主題中稱為 Headers 屬性)。WebServices 會在輸入標頭的方法被呼叫前,設定 Headers 屬性的值,然後在輸出標頭的方法傳回時,擷取該值。如需輸出或選擇性標頭的詳細資訊,請參閱 .NET Framework SDK 文件。
[WebMethod(Description="This method requires a custom soap header set by the caller")]
[SoapHeader("sHeader")]
public string SecureMethod() {
if (sHeader == null)
return "ERROR: Please supply credentials";
else
return "USER: " + sHeader.Username;
}
<WebMethod(), SoapHeader("sHeader")> Public Function SecureMethod() As String
If (sHeader Is Nothing)
Return "ERROR: Please supply credentials"
Else
Return "USER: " & sHeader.Username
End If
End Function
WebMethodAttribute(Description="This method requires a custom soap header set by the caller")
SoapHeaderAttribute("sHeader")
public string SecureMethod() {
if (sHeader == null)
return "ERROR: Please supply credentials";
else
return "USER: " + sHeader.Username;
}
C# VB JScript
接著,用戶端會在呼叫需要標頭的方法前,在 Proxy 類別上設定該標頭,如下列範例中所示:
HeaderService h = new HeaderService();
AuthHeader myHeader = new AuthHeader();
myHeader.Username = "JohnDoe";
myHeader.Password = "password";
h.AuthHeader = myHeader;
String result = h.SecureMethod();
Dim h As New HeaderService
Dim myHeader As New AuthHeader
myHeader.Username = "JohnDoe"
myHeader.Password = "password"
h.AuthHeader = myHeader
Dim result As String = h.SecureMethod()
var h:HeaderService = new HeaderService();
var myHeader:AuthHeader = new AuthHeader();
myHeader.Username = "JohnDoe";
myHeader.Password = "password";
h.AuthHeader = myHeader;
var result:String = h.SecureMethod();
C# VB JScript
若要查看這個程式碼的執行狀況,請執行下列範例:
Visual Basic SoapHeaders.aspx
[執行範例] | [檢視原始檔]
章節摘要
使用 Windows 驗證來設定伺服器上 XML Web Services 安全性所用的方法,完全與為 .aspx 網頁所描述的模型相同。
您還可以透過程式設計的方式,使用 WebService Proxy 類別上的 Username 和 Password 屬性來設定 Windows 憑證。
最後,您可以把 SOAP 要求與 SOAPHeaders 之類的憑證資訊一起傳遞給需要 SOAP 要求的方法,來執行自訂的驗證。
轉貼自: http://cht.gotdotnet.com/quickstart/asp ... vices.aspx
安全性和 WebServices
Windows 驗證和授權
自訂的驗證和授權 (使用 Soap 標頭)
章節摘要
--------------------------------------------------------------------------------
這個章節描述設定 XML Web Services 安全性的方法。如果您尚未讀過這個教學課程的安全性章節,請在繼續這個主題前,花一些時間來閱讀。
Windows 驗證和授權
您用 Windows 驗證 (Authentication) 來保護 XML Web Services 的安全,這項技術與用來保護 .aspx 網頁的技術相同 (在 Windows 架構驗證章節中有描述)。若需要驗證,請為您的應用程式啟用整合式 Windows 驗證,並停用 IIS 管理主控台中的匿名存取。若要允許或拒絕特定的使用者存取您的服務,請使用 ASP.NET 組態系統或在服務檔案本身上設定 ACL,如下列範例所示:
<configuration>
<system.web>
<authentication mode="Windows"/>
</system.web>
<location path="secureservice.asmx">
<system.web>
<authorization>
<allow users="Administrator"/>
<allow users="DOMAINBradley"/>
<deny roles="BUILTINPower Users"/>
</authorization>
</system.web>
</location>
</configuration>
當您知道 XML Web Services 的用戶端會以特定的 Windows 使用者來執行時,這種方法很有效。一種有趣的情形是用戶端以某使用者來執行,但卻代表另一使用者來進行動作。請考慮存取安全 XML Web Services 的 ASP.NET 網頁,該網頁不會模擬存取網頁的用戶端。在這種情形下,您應以程式設計的方式,在連接到 Web 服務前,設定使用者名稱和密碼。下列的範例使用基本驗證,並描述簡單的 WebService:
<%@ WebService language="C#" Class="SecureService" %>
using System.Web.Services;
using System;
class SecureService : WebService {
[WebMethod]
public String SecureTest() {
return "Hello from the secure web service";
}
}
<%@ WebService language="VB" Class="SecureService" %>
Imports System.Web.Services
Imports System
Class SecureService : Inherits WebService
<WebMethod()> Public Function SecureTest As String
Return "Hello from the secure web service"
End
End Class
<%@ WebService language="JScript" Class="SecureService" %>
import System.Web.Services;
import System;
class SecureService extends WebService {
WebMethodAttribute function SecureTest() : String {
return "Hello from the secure web service";
}
}
C# VB JScript
如下所示,您可在 IIS 中進行適當的設定,為這項服務使用必要的基本驗證:
開啟 IIS MMC 主控台。
Start->Run "inetmgr"
在左方的窗格中,展開樹狀結構來尋找虛擬目錄。
在右方的窗格中,用滑鼠右鍵按一下 [Secureservice.asmx],然後選擇 [內容]。
選取 [檔案安全設定] 索引標籤。在 [匿名存取及驗證控制] 下按一下 [編輯]。
停用匿名存取。
停用整合的 Windows 驗證。
啟用基本驗證。
按一下 [確定] 來儲存這些設定,並結束 MMC 主控台。
基底 WebService Proxy 類別提供兩種屬性:Username 和 Password,您可以用它們來指定連接到遠端 Web 服務時所用的憑證。這些必須設定成 Web 服務的電腦或網域上有效的 Windows 憑證。
<%@ Import Namespace="SecureService" %>
<html>
<script language="C#" runat="server">
public void Page_Load(Object sender, EventArgs e) {
SecureService s = new SecureService();
s.Credentials = new System.Net.NetworkCredential("Administrator", "test123");
Message.Text = s.SecureTest();
}
</script>
<body>
<h4><font face="verdana">
<asp:Label id="Message" runat="server"/>
</font></h4>
</body>
</html>
<%@ Import Namespace="SecureService" %>
<html>
<script language="VB" runat="server">
Public Sub Page_Load(sender As Object, e As EventArgs)
Dim s As New SecureService
s.Credentials = New System.Net.NetworkCredential("Administrator", "test123")
Message.Text = s.SecureTest()
End Sub
</script>
<body>
<h4><font face="verdana">
<asp:Label id="Message" runat="server"/>
</font></h4>
</body>
</html>
<%@ Import Namespace="SecureService" %>
<html>
<script language="JScript" runat="server">
public function Page_Load(sender : Object, e : EventArgs) {
SecureService s = new SecureService();
s.Credentials = new System.Net.NetworkCredential("Administrator", "test123");
Message.Text = s.SecureTest();
}
</script>
<body>
<h4><font face="verdana">
<asp:Label id="Message" runat="server"/>
</font></h4>
</body>
</html>
C# VB JScript
基底 WebService 類別還提供 System.Security.Principal.IPrincipal 型別的 User 屬性,您可用它來擷取用戶端使用者的相關資訊。同樣地,您可以使用 ASP.NET 組態系統中的 Authorization 區段來授權對 Web 服務的存取。
自訂的驗證和授權 (使用 Soap 標頭)
Windows 驗證對 Intranet 案例而言很適合,在這種情形中,您是對自己網域中的使用者來進行驗證。但在網際網路上,您就可能需要依據 SQL 資料庫來執行自訂的驗證和授權。在這種情形中,您應該將自訂的憑證 (例如使用者名稱和密碼) 傳遞至服務,並讓它自行處理驗證和授權。
若要在傳遞要求至 XML Web Services 時附加資訊,SOAP 標頭是一種簡單的方式。若要執行這項作業,請在服務中定義衍生自 SOAPHeader 的類別,然後再將服務的公用 (Public) 欄位宣告成該型別。這會公開在服務的公用合約中,並在 Proxy 從 WebServiceUtil.exe 建立時,提供給用戶端使用,如下所示:
using System.Web.Services;
using System.Web.Services.Protocols;
// AuthHeader class extends from SoapHeader
public class AuthHeader : SoapHeader {
public string Username;
public string Password;
}
public class HeaderService : WebService {
public AuthHeader sHeader;
...
}
Imports System.Web.Services
Imports System.Web.Services.Protocols
' AuthHeader class extends from SoapHeader
Public Class AuthHeader : Inherits SoapHeader
Public Username As String
Public Password As String
End Class
Public Class HeaderService : Inherits WebService
Public sHeader As AuthHeader
...
End Class
import System.Web.Services;
import System.Web.Services.Protocols;
// AuthHeader class extends from SoapHeader
public class AuthHeader extends SoapHeader {
public var Username:String;
public var Password:String;
}
public class HeaderService extends WebService {
public var sHeader:AuthHeader;
...
}
C# VB JScript
服務中的每個 WebMethod 都可使用 SoapHeader 自訂屬性定義一組相關的標頭。依預設值,標頭是必要的,但您也可以定義選擇性的標頭。SoapHeader 屬性指定公用欄位的名稱,或 Client 或 Server 類別的屬性 (在這個主題中稱為 Headers 屬性)。WebServices 會在輸入標頭的方法被呼叫前,設定 Headers 屬性的值,然後在輸出標頭的方法傳回時,擷取該值。如需輸出或選擇性標頭的詳細資訊,請參閱 .NET Framework SDK 文件。
[WebMethod(Description="This method requires a custom soap header set by the caller")]
[SoapHeader("sHeader")]
public string SecureMethod() {
if (sHeader == null)
return "ERROR: Please supply credentials";
else
return "USER: " + sHeader.Username;
}
<WebMethod(), SoapHeader("sHeader")> Public Function SecureMethod() As String
If (sHeader Is Nothing)
Return "ERROR: Please supply credentials"
Else
Return "USER: " & sHeader.Username
End If
End Function
WebMethodAttribute(Description="This method requires a custom soap header set by the caller")
SoapHeaderAttribute("sHeader")
public string SecureMethod() {
if (sHeader == null)
return "ERROR: Please supply credentials";
else
return "USER: " + sHeader.Username;
}
C# VB JScript
接著,用戶端會在呼叫需要標頭的方法前,在 Proxy 類別上設定該標頭,如下列範例中所示:
HeaderService h = new HeaderService();
AuthHeader myHeader = new AuthHeader();
myHeader.Username = "JohnDoe";
myHeader.Password = "password";
h.AuthHeader = myHeader;
String result = h.SecureMethod();
Dim h As New HeaderService
Dim myHeader As New AuthHeader
myHeader.Username = "JohnDoe"
myHeader.Password = "password"
h.AuthHeader = myHeader
Dim result As String = h.SecureMethod()
var h:HeaderService = new HeaderService();
var myHeader:AuthHeader = new AuthHeader();
myHeader.Username = "JohnDoe";
myHeader.Password = "password";
h.AuthHeader = myHeader;
var result:String = h.SecureMethod();
C# VB JScript
若要查看這個程式碼的執行狀況,請執行下列範例:
Visual Basic SoapHeaders.aspx
[執行範例] | [檢視原始檔]
章節摘要
使用 Windows 驗證來設定伺服器上 XML Web Services 安全性所用的方法,完全與為 .aspx 網頁所描述的模型相同。
您還可以透過程式設計的方式,使用 WebService Proxy 類別上的 Username 和 Password 屬性來設定 Windows 憑證。
最後,您可以把 SOAP 要求與 SOAPHeaders 之類的憑證資訊一起傳遞給需要 SOAP 要求的方法,來執行自訂的驗證。