⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 secureservices.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
字号:
<%@ Register TagPrefix="Acme" Namespace="Acme" Assembly="QSTools" %>
<%@ Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%>

<!-- #include virtual="/quickstart/aspplus/include/header.inc" -->

<h4>安全性和 WebService</h4>

<div class="indent" style="font-family:Verdana; font-size:8pt;">
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#windows">Windows 身份验证和授权</a><br>
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#custom">使用 Soap 标头自定义身份验证和授权</a><br>
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#summary">本节小结</a><br>
</div>

<p>
<hr>
<p>

本节描述保证 XML Web 服务安全性的方法。如果还没有读过本教程的<a href="securityoverview.aspx">安全性</a>小节,在继续本主题前请先花点时间阅读这一节。
<p>

<!--BEGIN SUB SECTION--> <a name="windows"><span class="subhead">Windows 身份验证和授权</span>
<p>

使用对 .aspx 页所采用的方法,通过 Windows 身份验证来保证 XML Web 服务的安全性(详见<a href="windowsauth.aspx">基于 Windows 的身份验证</a>一节)。若需要身份验证,请在 IIS 管理控制台中为您的应用程序启用“集成的 Windows 身份验证”,并禁用“匿名访问”。若要允许或拒绝特定的用户访问服务,请使用 ASP.NET 配置系统,或在服务文件本身中设置 ACL,如下例所示:

<div class="code"><pre>
&lt;configuration&gt;

  &lt;system.web&gt;
    &lt;authentication mode="Windows"/&gt;
  &lt;/system.web&gt;

  &lt;location path="secureservice.asmx"&gt;

    &lt;system.web&gt;
      &lt;authorization&gt;
        &lt;allow users="Administrator"/&gt;
        &lt;allow users="DOMAIN\Bradley"/&gt;
        &lt;deny roles="BUILTIN\Power Users"/&gt;
      &lt;/authorization&gt;
    &lt;/system.web&gt;

  &lt;/location&gt;

&lt;/configuration&gt;
</pre></div>
<p>


这非常适合已知 XML Web 服务的客户端将作为某个特定 Windows 用户运行的情况。更有趣的情况是客户端作为一个用户运行,但却代表另一个用户。请考虑一个 ASP.NET 页,它访问的安全 XML Web 服务不模拟访问它的客户端。对于这样的情况,在连接到 Web 服务前,应通过编程设置用户名和密码。下面的示例使用基本身份验证,并说明一个简单的 <b>WebService</b>:

<p>

<Acme:TabControl runat="server">
<Tab Name="C#">
&lt;%@ WebService language="C#" Class="SecureService" %&gt;

using System.Web.Services;
using System;

class SecureService : WebService {

    [WebMethod]
    public String SecureTest() {
        return "Hello from the secure web service";
    }
}
</Tab>
<Tab Name="VB">
&lt;%@ WebService language="VB" Class="SecureService" %&gt;

Imports System.Web.Services
Imports System

Class SecureService : Inherits WebService


    &lt;WebMethod()&gt; Public Function SecureTest As String
        Return "Hello from the secure web service"
    End
End Class
</Tab>
<Tab Name="JScript">
&lt;%@ WebService language="JScript" Class="SecureService" %&gt;

import System.Web.Services;
import System;

class SecureService extends WebService {


    WebMethodAttribute function SecureTest() : String {
        return "Hello from the secure web service";
    }
}
</Tab>
</Acme:TabControl>
<p>

可以在 IIS 中做适当的设置,要求对此服务进行基本身份验证,如下所示:

<p>

<ol>
<li> 打开 IIS MMC 控制台。<p>
<div class="code"><pre>
Start->Run "inetmgr"
</pre></div>

<li> 在左边的窗格中,展开目录树查找虚拟目录。
<li> 在右边的窗格中,右击“Secureservice.asmx”并选择“属性”。
<li> 选择“文件安全性”选项卡。在“匿名访问和验证控件”下,单击“编辑”。<p>

  <ul>
<li>  禁用匿名访问。
<li>  禁用集成 Windows 身份验证。
<li>  启用基本身份验证。
  </ul>

<p>
<li> 单击“确定”保存这些设置并退出 MMC 控制台。
</ol>

基 <b>WebService</b> 代理类提供两个属性:<b>Username</b> 和 <b>Password</b>。可以使用这两个属性指定凭据,并通过凭据连接到远程 Web 服务。必须将它们设置成 Web 服务的计算机或域上的有效 Windows 凭据。<p>

<p>

<Acme:TabControl runat="server">
<Tab Name="C#">
&lt;%@ Import Namespace="SecureService" %&gt;

&lt;html&gt;
&lt;script language="C#" runat="server"&gt;

    public void Page_Load(Object sender, EventArgs e) {

        SecureService s = new SecureService();
        s.Credentials = new System.Net.NetworkCredential("Administrator", "test123");
        Message.Text = s.SecureTest();
    }

&lt;/script&gt;

&lt;body&gt;
  &lt;h4&gt;&lt;font face="verdana"&gt;
    &lt;asp:Label id="Message" runat="server"/&gt;
  &lt;/font&gt;&lt;/h4&gt;
&lt;/body&gt;

&lt;/html&gt;
</Tab>
<Tab Name="VB">
&lt;%@ Import Namespace="SecureService" %&gt;

&lt;html&gt;
&lt;script language="VB" runat="server"&gt;

    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

&lt;/script&gt;

&lt;body&gt;
  &lt;h4&gt;&lt;font face="verdana"&gt;
    &lt;asp:Label id="Message" runat="server"/&gt;
  &lt;/font&gt;&lt;/h4&gt;
&lt;/body&gt;

&lt;/html&gt;
</Tab>
<Tab Name="JScript">
&lt;%@ Import Namespace="SecureService" %&gt;

&lt;html&gt;
&lt;script language="JScript" runat="server"&gt;

    public function Page_Load(sender : Object, e : EventArgs) {

        SecureService s = new SecureService();

        s.Credentials = new System.Net.NetworkCredential("Administrator", "test123");

        Message.Text = s.SecureTest();
    }

&lt;/script&gt;

&lt;body&gt;
  &lt;h4&gt;&lt;font face="verdana"&gt;
    &lt;asp:Label id="Message" runat="server"/&gt;
  &lt;/font&gt;&lt;/h4&gt;
&lt;/body&gt;

&lt;/html&gt;
</Tab>
</Acme:TabControl>

<p>
基 <b>WebService</b> 类还提供 <b>System.Security.Principal.IPrincipal</b> 类型的 <b>User</b> 属性,该属性可用来检索有关客户端用户的信息。此外,可以使用 ASP.NET 配置系统中的 <b>Authorization</b> 节授权对 Web 服务的访问。
<p>

<!--BEGIN SUB SECTION--> <a name="custom"><span class="subhead">使用 Soap 标头自定义身份验证和授权</span>
<p>

Windows 身份验证非常适合 Intranet 方案,这种情况下您是对自己的域中的用户进行身份验证。然而在 Internet 上,您可能需要对 SQL 数据库执行自定义身份验证和授权。在这种情况中,应向服务传递自定义凭据(如用户名和密码),并让服务自己处理身份验证和授权。
<p>
将额外的信息连同请求一起传递给 XML Web 服务的简便方法是通过 SOAP 标头。为此,需要在服务中定义一个从 <b>SOAPHeader</b> 派生的类,然后将服务的公共字段声明为该类型。这在服务的公共合同中公开,并且当从 WebServiceUtil.exe 创建代理时可由客户端使用,如下例所示:
<p>

<Acme:TabControl runat="server">
<Tab Name="C#">
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;
    ...
}
</Tab>
<Tab Name="VB">
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
</Tab>
<Tab Name="JScript">
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;
    ...
}
</Tab>
</Acme:TabControl>


<p>
服务中的每个 <b>WebMethod</b> 都可以使用 <b>SoapHeader</b> 自定义属性定义一组关联的标头。默认情况下,标头是必需的,但也可以定义可选标头。<b>SoapHeader</b> 属性指定公共字段的名称或者 <b>Client</b> 或 <b>Server</b> 类的属性(本标题中称为 <b>Headers</b> 属性)。在为输入标头调用方法前,<b>WebService</b> 设置 <b>Headers</b> 属性的值;而当方法为输出标头返回时,<b>WebService</b> 检索该值。有关输出标头或可选标头的更多信息,请参阅 .NET 框架 SDK 文档。
<p>


<Acme:TabControl runat="server">
<Tab Name="C#">
[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;

}
</Tab>
<Tab Name="VB">


&lt;WebMethod(), SoapHeader("sHeader")&gt; Public Function SecureMethod() As String

    If (sHeader Is Nothing)
        Return "ERROR: Please supply credentials"
    Else
        Return "USER: " & sHeader.Username
    End If
End Function
</Tab>
<Tab Name="JScript">
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;

}
</Tab>
</Acme:TabControl>
<p>

然后,客户端在调用要求标头的方法之前,直接在代理类上设置标头,如下面的示例所示:
<p>

<Acme:TabControl runat="server">
<Tab Name="C#">
HeaderService h = new HeaderService();
AuthHeader myHeader = new AuthHeader();
myHeader.Username = "JohnDoe";
myHeader.Password = "password";
h.AuthHeader = myHeader;
String result = h.SecureMethod();
</Tab>
<Tab Name="VB">
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()
</Tab>
<Tab Name="JScript">
var h:HeaderService = new HeaderService();
var myHeader:AuthHeader = new AuthHeader();
myHeader.Username = "JohnDoe";
myHeader.Password = "password";
h.AuthHeader = myHeader;
var result:String = h.SecureMethod();
</Tab>
</Acme:TabControl>
<p>

若要查看此代码的运行情况,请运行下面的示例:
<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/services/soapheaders/CS/soapheaders.aspx"
  ViewSource="/quickstart/aspplus/samples/services/soapheaders/soapheaders.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="C# SoapHeaders.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/services/soapheaders/VB/soapheaders.aspx"
  ViewSource="/quickstart/aspplus/samples/services/soapheaders/soapheaders.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="VB SoapHeaders.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/services/soapheaders/JS/soapheaders.aspx"
  ViewSource="/quickstart/aspplus/samples/services/soapheaders/soapheaders.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="JScript SoapHeaders.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>
<h4><a name="summary">本节小结</a></h4>
<ol>
<li>使用 Windows 身份验证保证服务器上的 XML Web 服务安全性遵从与为 .aspx 页描述的完全相同的模型。
<li>还可以通过编程来设置 Windows 凭据,使用 <b>WebService</b> 代理类上的 <b>Username</b> 和 <b>Password</b> 属性。
<li>最后,可以自定义身份验证,将凭据信息作为 <b>SOAPHeaders</b> 并连同 SOAP 请求一起传递给需要它的方法。
</ol>
<p>

<!-- #include virtual="/quickstart/include/footer.inc" --> <!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -