次の方法で共有


AuthenticationManager クラス

クライアント認証プロセス中に呼び出される認証モジュールを管理します。

この型のすべてのメンバの一覧については、AuthenticationManager メンバ を参照してください。

System.Object
   System.Net.AuthenticationManager

Public Class AuthenticationManager
[C#]
public class AuthenticationManager
[C++]
public __gc class AuthenticationManager
[JScript]
public class AuthenticationManager

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

AuthenticationManager は、アプリケーションが使用する認証モジュールを管理する静的クラスです。保護されたリソースに対して要求を行った場合、 AuthenticationManagerAuthenticate メソッドを呼び出して、次の要求で使用する Authorization インスタンスを取得します。

AuthenticationManager はモジュールごとに IAuthenticationModule.Authenticate メソッドを呼び出して、登録された各認証モジュールに照会します。 Authorization インスタンスを返した最初の認証モジュールが要求を認証するために使用されます。

既定では、基本、ダイジェスト、ネゴシエート、NTLM、Kerberos の各認証の種類を提供するモジュールが AuthenticationManager で登録されています。 IAuthenticationModule インターフェイスを実装する認証モジュールは、 Register メソッドを使用して追加できます。認証モジュールは、一覧に追加した順序で呼び出されます。

メモ   Kerberos 認証およびネゴシエート認証の種類は、Windows 95/98 および Windows NT 4.0 ではサポートされていません。

使用例

 
' The following example shows how to create a custom Basic authentication module,
' how to register it using the AuthenticationManager class and how to authorize  
' users to access a Web site.
' Note: To run this program you must create a test Web site that performs
' Basic authentication. Also you must add to your server machine a user whose
' credentials are the same as the ones you use in this program.
' Attention: Basic authentication sends the user's credentials over HTTP. 
' Passwords and user names are encoded using Base64 encoding. Although the 
' user information is encoded, it is considered insecure becasue it could be deciphered 
' relatively easily. 
' If you must use Basic authentication you are strongly advised to use strong 
' security mechanisms, such as SSL, when transferring sensitive information.


Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Collections
Imports Microsoft.VisualBasic

Namespace Mssc.Services.Authentication

  Module TestingAuthentication

    ' The ClientAuthentication class performs the following main tasks:
    ' 1) Obtains the user's credentials.
    ' 2) Unregisters the standard Basic authentication.
    ' 3) Registers the custom Basic authentication.
    ' 4) Reads the selected page and displays it on the console.

    Class TestAuthentication

      Private Shared username, password, ___domain, uri As String


      'This method invoked when the user does not enter the required input parameters.
      Private Shared Sub showusage()
        Console.WriteLine("Attempts to authenticate to a URL")
        Console.WriteLine(ControlChars.Cr + ControlChars.Lf + "Use one of the following:")
        Console.WriteLine(ControlChars.Tab + "customBasicAuthentication URL username password ___domain")
        Console.WriteLine(ControlChars.Tab + "customBasicAuthentication URL username password")
      End Sub 'showusage


      ' Display registered authentication modules.
      Private Shared Sub displayRegisteredModules()
        ' The AuthenticationManager calls all authentication modules sequentially 
        ' until one of them responds with an authorization instance.  Show
        ' the current registered modules.
        Dim registeredModules As IEnumerator = AuthenticationManager.RegisteredModules
        Console.WriteLine(ControlChars.Cr + ControlChars.Lf + "The following authentication modules are now registered with the system:")
        While registeredModules.MoveNext()
          Console.WriteLine(ControlChars.Cr + " " + ControlChars.Lf + " Module : {0}", registeredModules.Current)
          Dim currentAuthenticationModule As IAuthenticationModule = CType(registeredModules.Current, IAuthenticationModule)
          Console.WriteLine(ControlChars.Tab + "  CanPreAuthenticate : {0}", currentAuthenticationModule.CanPreAuthenticate)
        End While
      End Sub 'displayRegisteredModules 

      ' The getPage method accesses the selected page and displays its content 
      ' on the console.
      Private Shared Sub getPage(ByVal url As [String])
        Try
          ' Create the Web request object.
          Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)

          ' Define the request access method.
          req.Method = "GET"

          ' Define the request credentials according to the user's input.
          If ___domain = [String].Empty Then
            req.Credentials = New NetworkCredential(username, password)
            ' If the user does not specify the Internet resource ___domain, this usually
            ' is by default the name of the sever hosting the resource.
          Else
            req.Credentials = New NetworkCredential(username, password, ___domain)
          End If
          ' Issue the request.
          Dim result As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)

          Console.WriteLine(ControlChars.Lf + "Authentication Succeeded:")

          ' Store the response.
          Dim sData As Stream = result.GetResponseStream()

          ' Display the response.
          displayPageContent(sData)
        Catch e As WebException
          ' Display any errors. In particular, display any protocol-related error. 
          If e.Status = WebExceptionStatus.ProtocolError Then
            Dim hresp As HttpWebResponse = CType(e.Response, HttpWebResponse)
            Console.WriteLine((ControlChars.Lf + "Authentication Failed, " + hresp.StatusCode))
            Console.WriteLine(("Status Code: " + Fix(hresp.StatusCode)))
            Console.WriteLine(("Status Description: " + hresp.StatusDescription))
            Return
          End If
          Console.WriteLine(("Caught Exception: " + e.Message))
          Console.WriteLine(("Stack: " + e.StackTrace))
        End Try
      End Sub 'getPage


      ' The displayPageContent method display the content of the
      ' selected page.
      Private Shared Sub displayPageContent(ByVal ReceiveStream As Stream)
        ' Create an ASCII encoding object.
        Dim ASCII As Encoding = Encoding.ASCII

        ' Define the byte array to temporarily hold the current read bytes. 
        Dim read(511) As [Byte]

        Console.WriteLine(ControlChars.Cr + ControlChars.Lf + "Page Content..." + ControlChars.Cr + ControlChars.Lf)

        ' Read the page content and display it on the console.
        ' Read the first 512 bytes.
        Dim bytes As Integer = ReceiveStream.Read(read, 0, 512)
        While bytes > 0
          Console.Write(ASCII.GetString(read, 0, bytes))
          bytes = ReceiveStream.Read(read, 0, 512)
        End While
        Console.WriteLine("")
      End Sub 'displayPageContent

      'Entry point which delegates to C-style main Private Function
      'Public Overloads Sub Main(ByVal args() As String)
      ' Main(System.Environment.GetCommandLineArgs())
      'End Sub


      ' This is the program entry point. It allows the user to enter 
      ' her credentials and the Internet resource (Web page) to access.
      ' It also unregisters the standard and registers the customized Basic 
      ' authentication.
      Public Shared Sub Main(ByVal args() As String)

        If args.Length < 3 Then
          showusage()
        Else

          ' Read the user's credentials.
          uri = args(0)
          username = args(1)
          password = args(2)

          If args.Length = 3 Then
            ___domain = String.Empty
            ' If the ___domain exists, store it. Usually the ___domain name
            ' is by default the name of the server hosting the Internet
            ' resource.
          Else
            ___domain = args(3)
          End If

          ' Instantiate the custom Basic authentication module.
          Dim customBasicModule As New CustomBasic()

          ' Unregister the standard Basic authentication module.
          AuthenticationManager.Unregister("Basic")

          ' Register the custom Basic authentication module.
          AuthenticationManager.Register(customBasicModule)

          ' Display registered authorization modules.
          displayRegisteredModules()

          ' Read the specified page and display it on the console.
          getPage(uri)
        End If
        Return
      End Sub 'Main


    ' The CustomBasic class creates a custom Basic authentication by implementing the
    ' IAuthenticationModule interface. It performs the following
    ' tasks:
    ' 1) Defines and initializes the required properties.
    ' 2) Implements the Authenticate and PreAuthenticate methods.

    Public Class CustomBasic
      Implements IAuthenticationModule

      Private m_authenticationType As String
      Private m_canPreAuthenticate As Boolean


      ' The CustomBasic constructor initializes the properties of the customized 
      ' authentication.
      Public Sub New()
        m_authenticationType = "Basic"
        m_canPreAuthenticate = False
      End Sub 'New

      ' Define the authentication type. This type is then used to identify this
      ' custom authentication module. The default is set to Basic.

      Public ReadOnly Property AuthenticationType() As String _
       Implements IAuthenticationModule.AuthenticationType

        Get
          Return m_authenticationType
        End Get
      End Property

      ' Define the pre-authentication capabilities for the module. The default is set
      ' to false.

      Public ReadOnly Property CanPreAuthenticate() As Boolean _
       Implements IAuthenticationModule.CanPreAuthenticate


        Get
          Return m_canPreAuthenticate
        End Get
      End Property

    ' The checkChallenge method checks whether the challenge sent by the HttpWebRequest 
    ' contains the correct type (Basic) and the correct ___domain name. 
    ' Note: The challenge is in the form BASIC REALM="DOMAINNAME"; 
    ' the Internet Web site must reside on a server whose
    ' ___domain name is equal to DOMAINNAME.
      Public Function checkChallenge(ByVal Challenge As String, ByVal ___domain As String) As Boolean
        Dim challengePasses As Boolean = False

        Dim tempChallenge As [String] = Challenge.ToUpper()

        ' Verify that this is a Basic authorization request and that the requested ___domain
        ' is correct.
        ' Note: When the ___domain is an empty string, the following code only checks 
        ' whether the authorization type is Basic.
        If tempChallenge.IndexOf("BASIC") <> -1 Then
          If ___domain <> [String].Empty Then
            If tempChallenge.IndexOf(___domain.ToUpper()) <> -1 Then
              challengePasses = True
              ' The ___domain is not allowed and the authorization type is Basic.
            Else
              challengePasses = False
            End If
            ' The ___domain is a blank string and the authorization type is Basic.
          Else
            challengePasses = True
          End If
        End If
        Return challengePasses
      End Function 'checkChallenge


      ' The PreAuthenticate method specifies whether the authentication implemented 
      ' by this class allows pre-authentication. 
      ' Even if you do not use it, this method must be implemented to obey to the rules 
      ' of interface implementation.
      ' In this case it always returns null. 
      Public Function PreAuthenticate(ByVal request As WebRequest, ByVal credentials As ICredentials) As Authorization _
          Implements IAuthenticationModule.PreAuthenticate

        Return Nothing
      End Function 'PreAuthenticate

      
      ' Authenticate is the core method for this custom authentication.
      ' When an Internet resource requests authentication, the WebRequest.GetResponse 
      ' method calls the AuthenticationManager.Authenticate method. This method, in 
      ' turn, calls the Authenticate method on each of the registered authentication
      ' modules, in the order in which they were registered. When the authentication is 
      ' complete an Authorization object is returned to the WebRequest.
      Public Function Authenticate(ByVal challenge As String, ByVal request As WebRequest, ByVal credentials As ICredentials) As Authorization _
          Implements IAuthenticationModule.Authenticate


        Dim ASCII As Encoding = Encoding.ASCII

        ' Get the username and password from the credentials
        Dim MyCreds As NetworkCredential = credentials.GetCredential(request.RequestUri, "Basic")

        If PreAuthenticate(request, credentials) Is Nothing Then
          Console.WriteLine(ControlChars.Lf + " Pre-authentication is not allowed.")
        Else
          Console.WriteLine(ControlChars.Lf + " Pre-authentication is allowed.")
        End If
        ' Verify that the challenge satisfies the authorization requirements.
        Dim challengeOk As Boolean = checkChallenge(challenge, MyCreds.Domain)

        If Not challengeOk Then
          Return Nothing
        End If

        ' Create the encrypted string according to the Basic authentication format as
        ' follows:
        ' a)Concatenate the username and password separated by colon;
        ' b)Apply ASCII encoding to obtain a stream of bytes;
        ' c)Apply Base64 encoding to this array of bytes to obtain the encoded 
        ' authorization.
        Dim BasicEncrypt As String = MyCreds.UserName + ":" + MyCreds.Password

        Dim BasicToken As String = "Basic " + Convert.ToBase64String(ASCII.GetBytes(BasicEncrypt))

        ' Create an Authorization object using the encoded authorization above.
        Dim resourceAuthorization As New Authorization(BasicToken)

        ' Get the Message property, which contains the authorization string that the 
        ' client returns to the server when accessing protected resources.
        Console.WriteLine(ControlChars.Lf + " Authorization Message:{0}", resourceAuthorization.Message)

        ' Get the Complete property, which is set to true when the authentication process 
        ' between the client and the server is finished.
        Console.WriteLine(ControlChars.Lf + " Authorization Complete:{0}", resourceAuthorization.Complete)

        Console.WriteLine(ControlChars.Lf + " Authorization ConnectionGroupId:{0}", resourceAuthorization.ConnectionGroupId)


        Return resourceAuthorization
      End Function 'Authenticate
    End Class 'CustomBasic 
  End Module
End Namespace

[C#] 

// The following example shows how to create a custom Basic authentication module,
// how to register it using the AuthenticationManager class and how to authorize  
// users to access a Web site.
// Note: To run this program you must create a test Web site that performs
// Basic authentication. Also you must add to your server machine a user whose
// credentials are the same as the ones you use in this program.
// Attention: Basic authentication sends the user's credentials over HTTP. 
// Passwords and user names are encoded using Base64 encoding. Although the 
// user information is encoded, it is considered insecure becasue it could be deciphered 
// relatively easily. 
// If you must use Basic authentication you are strongly advised to use strong 
// security mechanisms, such as SSL, when transferring sensitive information.


using System;
using System.Net;
using System.IO;
using System.Text;
using System.Collections;


namespace Mssc.Services.Authentication
{
  // The ClientAuthentication class performs the following main tasks:
  // 1) Obtains the user's credentials.
  // 2) Unregisters the standard Basic authentication.
  // 3) Registers the custom Basic authentication.
  // 4) Reads the selected page and displays it on the console.
  class TestAuthentication 
  {

    private static string username, password, ___domain, uri;

    // This method invoked when the user does not enter the required input parameters.
    private static void showusage() 
    {
      Console.WriteLine("Attempts to authenticate to a URL");
      Console.WriteLine("\r\nUse one of the following:");
      Console.WriteLine("\tcustomBasicAuthentication URL username password ___domain");
      Console.WriteLine("\tcustomBasicAuthentication URL username password");
    }

    // Display registered authentication modules.
    private static void displayRegisteredModules() 
    {
      // The AuthenticationManager calls all authentication modules sequentially 
      // until one of them responds with an authorization instance.  Show
      // the current registered modules.
      IEnumerator registeredModules = AuthenticationManager.RegisteredModules; 
      Console.WriteLine("\r\nThe following authentication modules are now registered with the system:");
      while(registeredModules.MoveNext())
      {
        Console.WriteLine("\r \n Module : {0}",registeredModules.Current); 
        IAuthenticationModule currentAuthenticationModule = (IAuthenticationModule)registeredModules.Current;
        Console.WriteLine("\t  CanPreAuthenticate : {0}",currentAuthenticationModule.CanPreAuthenticate); 
      }      
    }

    // The getPage method accesses the selected page and displays its content 
    // on the console.
    private static void getPage(String url) 
    {
      try 
      {
        // Create the Web request object.
        HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
        
        // Define the request access method.
        req.Method = "GET";
        
        // Define the request credentials according to the user's input.
        if (___domain == String.Empty)
          req.Credentials = new NetworkCredential(username, password);
        else
          // If the user does not specify the Internet resource ___domain, this usually
          // is by default the name of the sever hosting the resource.
          req.Credentials = new NetworkCredential(username, password, ___domain);

        // Issue the request.
        HttpWebResponse result = (HttpWebResponse) req.GetResponse();

        Console.WriteLine("\nAuthentication Succeeded:");

        // Store the response.
        Stream sData = result.GetResponseStream();

        // Display the response.
        displayPageContent(sData);
      }
      catch (WebException e)
      {
        // Display any errors. In particular, display any protocol-related error. 
        if (e.Status == WebExceptionStatus.ProtocolError)
        {                
          HttpWebResponse hresp = (HttpWebResponse) e.Response;
          Console.WriteLine("\nAuthentication Failed, " + hresp.StatusCode);
          Console.WriteLine("Status Code: " + (int) hresp.StatusCode);
          Console.WriteLine("Status Description: " + hresp.StatusDescription);                
          return;
        }
        Console.WriteLine("Caught Exception: " + e.Message);
        Console.WriteLine("Stack: " + e.StackTrace);
      }
    }

    // The displayPageContent method display the content of the
    // selected page.
    private static void displayPageContent(Stream ReceiveStream) 
    {
      // Create an ASCII encoding object.
      Encoding ASCII = Encoding.ASCII;
    
      // Define the byte array to temporarily hold the current read bytes. 
      Byte[] read = new Byte[512];

      Console.WriteLine("\r\nPage Content...\r\n");

      // Read the page content and display it on the console.
      // Read the first 512 bytes.
      int bytes = ReceiveStream.Read(read, 0, 512);
      while (bytes > 0) 
      {
        Console.Write(ASCII.GetString(read, 0, bytes));
        bytes = ReceiveStream.Read(read, 0, 512);
      }
      Console.WriteLine("");
    }

    // This is the program entry point. It allows the user to enter 
    // her credentials and the Internet resource (Web page) to access.
    // It also unregisters the standard and registers the customized Basic 
    // authentication.
    public static void Main(string[] args) 
    {
    
      if (args.Length < 3)
        showusage();
      else 
      {    
         
        // Read the user's credentials.
        uri = args[0];
        username = args[1];
        password = args[2];

        if (args.Length == 3)
          ___domain = string.Empty;
        else
          // If the ___domain exists, store it. Usually the ___domain name
          // is by default the name of the server hosting the Internet
          // resource.
          ___domain = args[3];

      
        // Instantiate the custom Basic authentication module.
        CustomBasic customBasicModule = new CustomBasic();
           
        // Unregister the standard Basic authentication module.
        AuthenticationManager.Unregister("Basic");

        // Register the custom Basic authentication module.
        AuthenticationManager.Register(customBasicModule);
 
        // Display registered authorization modules.
        displayRegisteredModules();
        
        // Read the specified page and display it on the console.
        getPage(uri);
      }
      return;
    }
  }
 
  // The CustomBasic class creates a custom Basic authentication by implementing the
  // IAuthenticationModule interface. It performs the following
  // tasks:
  // 1) Defines and initializes the required properties.
  // 2) Implements the Authenticate method.
  
  public class CustomBasic : IAuthenticationModule
  {

    private string m_authenticationType ;
    private bool m_canPreAuthenticate ;

    // The CustomBasic constructor initializes the properties of the customized 
    // authentication.
    public CustomBasic()
    {
      m_authenticationType = "Basic";
      m_canPreAuthenticate = false;
    }

    // Define the authentication type. This type is then used to identify this
    // custom authentication module. The default is set to Basic.
    public string AuthenticationType
    {
      get
      {
        return m_authenticationType;
      }
    }

    // Define the pre-authentication capabilities for the module. The default is set
    // to false.
    public bool CanPreAuthenticate
    {
      get
      {
        return m_canPreAuthenticate;
      }
    }

    // The checkChallenge method checks whether the challenge sent by the HttpWebRequest 
    // contains the correct type (Basic) and the correct ___domain name. 
    // Note: The challenge is in the form BASIC REALM="DOMAINNAME"; 
    // the Internet Web site must reside on a server whose
    // ___domain name is equal to DOMAINNAME.
    public bool checkChallenge(string Challenge, string ___domain) 
    {
      bool challengePasses = false;

      String tempChallenge = Challenge.ToUpper();

      // Verify that this is a Basic authorization request and that the requested ___domain
      // is correct.
      // Note: When the ___domain is an empty string, the following code only checks 
      // whether the authorization type is Basic.

      if (tempChallenge.IndexOf("BASIC") != -1)
        if (___domain != String.Empty)
          if (tempChallenge.IndexOf(___domain.ToUpper()) != -1)
            challengePasses = true;
          else
            // The ___domain is not allowed and the authorization type is Basic.
            challengePasses = false;
        else
          // The ___domain is a blank string and the authorization type is Basic.
          challengePasses = true;

      return challengePasses;
    }

    // The PreAuthenticate method specifies whether the authentication implemented 
    // by this class allows pre-authentication. 
    // Even if you do not use it, this method must be implemented to obey to the rules 
    // of interface implementation.
    // In this case it always returns null. 
    public Authorization PreAuthenticate(WebRequest request, ICredentials credentials) 
    {                
      return null;
    }

    // Authenticate is the core method for this custom authentication.
    // When an Internet resource requests authentication, the WebRequest.GetResponse 
    // method calls the AuthenticationManager.Authenticate method. This method, in 
    // turn, calls the Authenticate method on each of the registered authentication
    // modules, in the order in which they were registered. When the authentication is 
    // complete an Authorization object is returned to the WebRequest.
    public Authorization Authenticate(String challenge, WebRequest request, ICredentials credentials) 
    {
      Encoding ASCII = Encoding.ASCII;        

      // Get the username and password from the credentials
      NetworkCredential MyCreds = credentials.GetCredential(request.RequestUri, "Basic");        

      if (PreAuthenticate(request, credentials) == null)
        Console.WriteLine("\n Pre-authentication is not allowed.");
      else
        Console.WriteLine("\n Pre-authentication is allowed.");

      // Verify that the challenge satisfies the authorization requirements.
      bool challengeOk = checkChallenge(challenge, MyCreds.Domain);

      if (!challengeOk)
        return null;

      // Create the encrypted string according to the Basic authentication format as
      // follows:
      // a)Concatenate the username and password separated by colon;
      // b)Apply ASCII encoding to obtain a stream of bytes;
      // c)Apply Base64 encoding to this array of bytes to obtain the encoded 
      // authorization.
      string BasicEncrypt = MyCreds.UserName + ":" + MyCreds.Password;

      string BasicToken = "Basic " + Convert.ToBase64String(ASCII.GetBytes(BasicEncrypt));

      // Create an Authorization object using the encoded authorization above.
      Authorization resourceAuthorization = new Authorization(BasicToken);

      // Get the Message property, which contains the authorization string that the 
      // client returns to the server when accessing protected resources.
      Console.WriteLine("\n Authorization Message:{0}",resourceAuthorization.Message);

      // Get the Complete property, which is set to true when the authentication process 
      // between the client and the server is finished.
      Console.WriteLine("\n Authorization Complete:{0}",resourceAuthorization.Complete);

      Console.WriteLine("\n Authorization ConnectionGroupId:{0}",resourceAuthorization.ConnectionGroupId);


      return resourceAuthorization;
    }
  }
}

[C++] 

// This program shows how to create a custom Basic authentication module,
// how to register it via the AuthenticationManager class and how to authorize
// users to access a Web site.
// Note: In order to run this program you must create a test Web site that performs
// Basic authentication. Also you must add to your server machine a user whose
// credentials are the same you use in this program.
// Attention: Basic authenticastion sends the user's credentials over HTTP.
// Passwords and user names are encoded using Base64 encoding. Although the
// user information is encoded, it is considered insecure due to the fact that it
// could be deciphered relatively easily.
// If you must use basic authentication you are strongly adviced to use strong
// security mechanisms, such as SSL, when transfering sensitive information on
// the wire.

#using <mscorlib.dll>
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::IO;
using namespace System::Text;
using namespace System::Collections;

// The ClientAuthentication class performs the following main tasks:
// 1) It obtains the user's credentials.
// 2) Unregisters the standard Basic authentication.
// 3) Registers the customized Basic authentication.
// 4) Reads the selected page and displays it on the console.
__gc class TestAuthentication {
public:
   static String *username, *password, *___domain, *uri;

   // Show how to use this program.
   static void showusage() {
      Console::WriteLine(S"Attempts to authenticate to a URL");
      Console::WriteLine(S"\r\nUse one of the following:");
      Console::WriteLine(S"\tcustomBasicAuthentication URL username password ___domain");
      Console::WriteLine(S"\tcustomBasicAuthentication URL username password");
      Console::WriteLine(S"\r\nExample:");
      Console::WriteLine(S"\tcustomBasicAuthentication http://ndpue/ncl/ basicuser basic.101 ndpue");
   }

   // Display registered authentication modules.
   static void displayRegisteredModules() {
      // The AuthenticationManager calls all authentication modules sequentially
      // until one of them responds with an authorization instance.  Show
      // the current registered modules, for testing purposes.
      IEnumerator* registeredModules = AuthenticationManager::RegisteredModules;
      Console::WriteLine(S"\r\nThe following authentication modules are now registered with the system");
      while(registeredModules->MoveNext()) {
         Console::WriteLine(S"\r \n Module : {0}",
            registeredModules->Current);
         IAuthenticationModule* currentAuthenticationModule =
            dynamic_cast<IAuthenticationModule*>(registeredModules->Current);
         Console::WriteLine(S"\t  CanPreAuthenticate : {0}", 
            __box(currentAuthenticationModule->CanPreAuthenticate));
      }
   }

   // The getPage method accesses the selected page an displays its content
   // on the console.
   static void getPage(String* url) {
      try {
         // Create the Web request object.

         HttpWebRequest* req = dynamic_cast<HttpWebRequest*> (WebRequest::Create(url));

         // Define the request access method.
         req->Method = S"GET";

         // Define the request credentials according to the user's input.
         if (String::Compare(___domain, String::Empty) == 0 )
            req->Credentials = new NetworkCredential(username, password);
         else
            // If the user's specifies the Internet resource ___domain, this usually
            // is by default the name of the sever hosting the resource.
            req->Credentials = new NetworkCredential(username, password, ___domain);

         // Issue the request.

         // req->GetResponse();

         HttpWebResponse* result = dynamic_cast<HttpWebResponse*> (req->GetResponse());
         Console::WriteLine(S"\nAuthentication Succeeded:");

         // Store the response.
         Stream*  sData = result->GetResponseStream();

         // Display the response.
         displayPageContent(sData);
      } catch (WebException* e) {
         // Display the error, if any. In particular display protocol
         // related error.
         if (e->Status == WebExceptionStatus::ProtocolError) {
            HttpWebResponse* hresp = dynamic_cast<HttpWebResponse*> (e->Response);
            Console::WriteLine(S"\nAuthentication Failed, {0}", __box(hresp->StatusCode));
            Console::WriteLine(S"Status Code: {0}", __box((int) hresp->StatusCode));
            Console::WriteLine(S"Status Description: {0}", hresp->StatusDescription);
            return;
         }
         Console::WriteLine(S"Caught Exception: {0}", e->Message);
         Console::WriteLine(S"Stack: {0}", e->StackTrace);
      }
   }

   // The displayPageContent method display the content of the
   // selected page.
   static void displayPageContent(Stream* ReceiveStream) {
      // Create an ASCII encoding object.
      Encoding*  ASCII = Encoding::ASCII;

      // Define the Byte array to temporary hold the current read bytes.
      Byte read[] = new Byte[512];

      Console::WriteLine(S"\r\nPage Content...\r\n");

      // Read the page content and display it on the console.
      // Read the first 512 bytes.
      int bytes = ReceiveStream->Read(read, 0, 512);
      while (bytes > 0) {
         Console::Write(ASCII->GetString(read, 0, bytes));
         bytes = ReceiveStream->Read(read, 0, 512);
      }
      Console::WriteLine(S"");
   }
};

// The CustomBasic class creates a custom Basic authentication by implementing the
// IAuthenticationModule interface. In particular it performs the following
// tasks:
// 1) Defines and initializes the required properties.
// 2) Impements the Authenticate method.

public __gc class CustomBasic : public IAuthenticationModule {
private:
   String* m_authenticationType;
   bool m_canPreAuthenticate;

   // The CustomBasic constructor initializes the properties of the customized
   // authentication.
public:
   CustomBasic() {
      m_authenticationType = S"Basic";
      m_canPreAuthenticate = false;
   }

   // Define the authentication type. This type is then used to identify this
   // custom authentication module. The default is set to Basic.
   __property String* get_AuthenticationType() {
      return m_authenticationType;
   }

   // Define the pre-authentication capabilities for the module. The default is set
   // to false.
   __property bool get_CanPreAuthenticate() {
      return m_canPreAuthenticate;
   }


   // The checkChallenge method checks if the challenge sent by the HttpWebRequest
   // contains the correct type (Basic) and the correct ___domain name.
   // Note: the challenge is in the form BASIC REALM=S"DOMAINNAME"
   // and you must assure that the Internet Web site resides on a server whose
   // ___domain name is equal to DOMAINAME.
   bool checkChallenge(String* Challenge, String* ___domain) {
      bool challengePasses = false;

      String*  tempChallenge = Challenge->ToUpper();
      // Verify that this is a Basic authorization request and the requested ___domain
      // is correct.
      // Note: When the ___domain is an empty string the following code only checks
      // whether the authorization type is Basic.
      if (tempChallenge->IndexOf(S"BASIC") != -1)
         if (String::Compare(___domain,String::Empty)!=0 )
            if (tempChallenge->IndexOf(___domain->ToUpper()) != -1)
               challengePasses = true;
            else
               // The ___domain is not allowed and the authorization type is Basic.
               challengePasses = false;
         else
            // The ___domain is a blank string and the authorization type is Basic.
            challengePasses = true;

      return challengePasses;
   }

   // The PreAuthenticate method specifies if the authentication implemented
   // by this class allows pre-authentication.
   // Even if you do not use it, this method must be implemented to obey to the rules
   // of interface implemebtation.
   // In this case it always returns null.
   Authorization * PreAuthenticate(WebRequest* request, ICredentials* credentials) {
      return 0;
   }

   // Authenticate is the core method for this custom authentication.
   // When an internet resource requests authentication, the WebRequest::GetResponse
   // method calls the AuthenticationManager::Authenticate method. This method, in
   // turn, calls the Authenticate method on each of the registered authentication
   // modules, in the order they were registered. When the authentication is
   // complete an Authorization object is returned to the WebRequest, as
   // shown by this routine's retun type.
   Authorization * Authenticate(String* challenge, WebRequest* request, ICredentials* credentials) {
      Encoding*  ASCII = Encoding::ASCII;

      // Get the username and password from the credentials
      NetworkCredential * MyCreds = credentials->GetCredential(request->RequestUri, S"Basic");

      if (PreAuthenticate(request, credentials) == 0)
         Console::WriteLine(S"\n Pre-authentication is not allowed.");
      else
         Console::WriteLine(S"\n Pre-authentication is allowed.");

      // Verify that the challenge satisfies the authorization requirements.
      bool challengeOk = checkChallenge(challenge, MyCreds->Domain);

      if (!challengeOk)
         return 0;

      // Create the encrypted string according to the Basic authentication format as
      // follows:
      // a)Concatenate username and password separated by colon;
      // b)Apply ASCII encoding to obtain a stream of bytes;
      // c)Apply Base64 Encoding to this array of bytes to obtain the encoded
      // authorization.
      String* BasicEncrypt = String::Concat(MyCreds->UserName, S":", MyCreds->Password);

      String* BasicToken = 
         String::Concat(S"Basic ", Convert::ToBase64String(ASCII->GetBytes(BasicEncrypt)));

      // Create an Authorization object using the above encoded authorization.
      Authorization* resourceAuthorization = new Authorization(BasicToken);

      // Get the Message property which contains the authorization string that the
      // client returns to the server when accessing protected resources
      Console::WriteLine(S"\n Authorization Message: {0}", resourceAuthorization->Message);

      // Get the Complete property which is set to true when the authentication process
      // between the client and the server is finished.
      Console::WriteLine(S"\n Authorization Complete: {0}", 
         __box(resourceAuthorization->Complete));

      Console::WriteLine(S"\n Authorization ConnectionGroupId: {0}", 
         resourceAuthorization->ConnectionGroupId);
      return resourceAuthorization;
   }
};

// This is the program entry point. It allows the user to enter
// her credentials and the Internet resource (Web page) to access.
// It also unregisters the standard and registers the customized basic
// authentication.
int main() {
   String* args[] = Environment::GetCommandLineArgs();

   if (args->Length < 4)
      TestAuthentication::showusage();
   else {
      // Read the user's credentials.
      TestAuthentication::uri = args[1];
      TestAuthentication::username = args[2];
      TestAuthentication::password = args[3];

      if (args->Length == 4)
         TestAuthentication::___domain = String::Empty;
      else
         // If the ___domain exists, store it. Usually the ___domain name
         // is by default the name of the server hosting the Internet
         // resource.
         TestAuthentication::___domain = args[4];


      // Instantiate the custom Basic authentication module.
      CustomBasic* customBasicModule = new CustomBasic();

      // Unregister the standard Basic authentication module.
      AuthenticationManager::Unregister(S"Basic");

      // Register the custom Basic authentication module.
      AuthenticationManager::Register(customBasicModule);

      // Display registered Authorization modules.
      TestAuthentication::displayRegisteredModules();

      // Read the specified page and display it on the console.
      TestAuthentication::getPage(TestAuthentication::uri);
   }
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Net

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

アセンブリ: System (System.dll 内)

参照

AuthenticationManager メンバ | System.Net 名前空間