이 설명서는 보관되지만 유지 되지 않습니다.

방법: SOAP 헤더를 사용하여 사용자 지정 인증 수행

이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation .

ASP.NET에서 다음과 같은 사용자 지정 솔루션을 빌드하여 SOAP 헤더를 통한 인증 메커니즘을 제공할 수 있습니다. 이 솔루션은 다음 단계를 실행하는 웹 서버의 사용자 지정 IHttpModule을 포함합니다.

  1. HTTP Module은 HTTP 메시지의 구문을 분석하여 SOAP 메시지인지 여부를 확인합니다.

  2. HTTP Module은 SOAP 메시지가 검색되면 SOAP 헤더를 읽습니다.

  3. SOAP 메시지에 인증 자격 증명이 있는 SOAP 헤더가 있으면 HTTP Module은 사용자 지정 global.asax 이벤트를 발생시킵니다.

제공된 예제에서 HTTP Module은 사용자를 인증하고 웹 서비스에서 클라이언트에 웹 서비스 액세스 권한을 부여할지 여부를 결정하는 Context 속성을 설정합니다.

9z52by6a.note(ko-kr,VS.100).gif참고:
이 예제에서 텍스트는 네트워크를 통해 암호화되지 않은 읽기 쉬운 형식으로 전송됩니다. 표시되는 텍스트가 응용 프로그램에 맞게 보안되지 않은 경우 암호화 알고리즘을 추가합니다.

예제

다음 코드 예제에서는 HTTP 메시지에서 SOAP 요청을 구문 분석하는 HTTP 모듈을 보여 줍니다. HTTP 메시지가 SOAP 메시지이면 사용자 지정 WebServiceAuthenticationEvent가 발생합니다.

using System;
using System.Web;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Text;
using System.Web.Services.Protocols;

namespace Microsoft.WebServices.Security {

      public sealed class WebServiceAuthenticationModule : IHttpModule 
      {
         private WebServiceAuthenticationEventHandler 
                       _eventHandler = null;

         public event WebServiceAuthenticationEventHandler Authenticate 
         {
           add { _eventHandler += value;}
           remove {_eventHandler -= value;}
         }
 
         public void Dispose() 
         {
         }

         public void Init(HttpApplication app) 
         {
           app.AuthenticateRequest += new
                      EventHandler(this.OnEnter);
         }

         private void OnAuthenticate(WebServiceAuthenticationEvent e) 
         {
           if (_eventHandler == null)
               return;

             _eventHandler(this, e);
             if (e.User != null)
                e.Context.User = e.Principal;
         }

         public string ModuleName
         {
           get{ return "WebServiceAuthentication"; }
         }

         void OnEnter(Object source, EventArgs eventArgs) {
           HttpApplication app = (HttpApplication)source;
           HttpContext context = app.Context;
           Stream HttpStream = context.Request.InputStream;

           // Save the current position of stream.
           long posStream = HttpStream.Position;

           // If the request contains an HTTP_SOAPACTION 
           // header, look at this message.
           if (context.Request.ServerVariables["HTTP_SOAPACTION"]
                          == null)
              return;

           // Load the body of the HTTP message
           // into an XML document.
           XmlDocument dom = new XmlDocument();
           string soapUser;
           string soapPassword;

           try 
           {
             dom.Load(HttpStream);

             // Reset the stream position.
             HttpStream.Position = posStream;

             // Bind to the Authentication header.
             soapUser =
                 dom.GetElementsByTagName("User").Item(0).InnerText;
             soapPassword =
                 dom.GetElementsByTagName("Password").Item(0).InnerText;
           } 
           catch (Exception e) 
           {
             // Reset the position of stream.
             HttpStream.Position = posStream;

             // Throw a SOAP exception.
             XmlQualifiedName name = new
                          XmlQualifiedName("Load");
             SoapException soapException = new SoapException(
                       "Unable to read SOAP request", name, e);
             throw soapException;
           }

           // Raise the custom global.asax event.
           OnAuthenticate(new WebServiceAuthenticationEvent
                        (context, soapUser, soapPassword));
           return;
      }
    }
}

다음 코드 예제에서는 SOAP 요청을 받으면 HTTP Module에 의해 발생하는 사용자 지정 인증 이벤트를 보여 줍니다.

namespace Microsoft.WebServices.Security {
    using System;
    using System.Web;
    using System.Security.Principal;

    public class WebServiceAuthenticationEvent : EventArgs {
       private Iprincipal _IPrincipalUser;
       private HttpContext _Context;
       private string _User;
       private string _Password;

       public WebServiceAuthenticationEvent(HttpContext context)
       {
            _Context = context;
       }

       public WebServiceAuthenticationEvent(HttpContext context,
                       string user, string password)
       {
           _Context = context;
           _User = user;
           _Password = password;
       }
       public  HttpContext Context 
       { 
         get { return _Context;}
       }
       public IPrincipal Principal 
       { 
         get { return _IPrincipalUser;} 
         set { _IPrincipalUser = value;}
       }
       public void Authenticate()
       {
         GenericIdentity i = new GenericIdentity(User);
         this.Principal = new GenericPrincipal(i, new String[0]);
       }
       public void Authenticate(string[] roles)
       {
         GenericIdentity i = new GenericIdentity(User);
         this.Principal = new GenericPrincipal(i, roles);
       }
       public string User 
       {
         get { return _User; }
         set { _User = value; }
       }
       public string Password
       {
         get { return _Password; }
         set { _Password = value; }
       }
       public bool HasCredentials {
         get 
         {
              if ((_User == null) || (_Password == null))
                return false;
              return true;
         }
       }
    }
}

다음 코드 예제에서는 사용자 지정 WebServiceAuthenticationEvent 이벤트에 대한 대리자를 보여 줍니다.

namespace Microsoft.WebServices.Security 
{
   using System;

   public delegate void WebServiceAuthenticationEventHandler(Object sender,  WebServiceAuthenticationEvent e);
}

다음 코드 예제에서는 클라이언트가 전달해야 하는 Authentication SOAP 헤더를 정의하는 웹 서비스를 보여 줍니다. 웹 서비스에서는 인증을 수행할 필요가 없습니다. 대신 User.Identity.IsAuthenticated 속성을 조사하여 HTTP Module에서 사용자를 인증했는지 여부를 확인할 수 있습니다.

<%@ WebService Language="C#" Class="SecureWebService" %>

using System;
using System.Web.Services;
using System.Web.Services.Protocols;

public class Authentication : SoapHeader {
  public string User;
  public string Password;
}

public class SecureWebService : WebService{
  public Authentication authentication;

  [WebMethod]
  [SoapHeader("authentication")]
  public string ValidUser(){
    if (User.IsInRole("Customer"))
      return "User is in role customer";

    if (User.Identity.IsAuthenticated)
      return "User is a valid user";
    return "not authenticated";
  }
}

다음 코드 예제에서는 Authentication SOAP 헤더에서 사용자 지정 SOAP 헤더 인증 메커니즘에 필요한 자격 증명을 전달하는 웹 서비스를 보여 줍니다.

// Create a new instance of a Web service proxy class.
SecureWebService s = new SecureWebService();

// Create the Authentication SOAP header and set values.
Authentication a = new Authentication();
a.User = user.Value;
a.Password = password.Value;

// Assign the Header.
s.AuthenticationValue = a;

string result = s.ValidUser();
span1.InnerHtml = result;

참고 항목

표시: