Printer Friendly Version      Send     
Click to Rate and Give Feedback
This page is specific to
Microsoft Visual Studio 2008/.NET Framework 3.5

Other versions are also available for the following:
IIS 7.0: CHttpModule::OnAuthenticateRequest Method

Represents the method that will handle an AuthenticateRequest event, which occurs when IIS establishes the identity of a user.

virtual REQUEST_NOTIFICATION_STATUS OnAuthenticateRequest(
   IN IHttpContext* pHttpContext,
   IN IAuthenticationProvider* pProvider
);
pHttpContext

[IN] A pointer to an IHttpContext interface.

pProvider

[IN] A pointer to an IAuthenticationProvider interface.

When a request-level module is registered for the RQ_AUTHENTICATE_REQUEST event notification, IIS will call the module's OnAuthenticateRequest method when IIS establishes the identity of a user.

Note:

Request-level modules can register for the AuthenticateRequest event notification by registering for RQ_AUTHENTICATE_REQUEST in the module's RegisterModule function.

The following code example demonstrates how to create a request-level HTTP module that registers for the RQ_AUTHENTICATE_REQUEST event and post-event notifications. When IIS prepares to establish the identity of a user, it will call the example module's OnAuthenticateRequest and OnPostAuthenticateRequest methods. Each method will write an entry in the application log of the Windows Event Viewer. When processing is complete, the module will exit.

Visual C++
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// Create the module class.
class MyHttpModule : public CHttpModule
{
public:

    // Process an RQ_AUTHENTICATE_REQUEST event.
    REQUEST_NOTIFICATION_STATUS
    OnAuthenticateRequest(
        IN IHttpContext * pHttpContext,
        IN IAuthenticationProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pHttpContext );
        UNREFERENCED_PARAMETER( pProvider );
        WriteEventViewerLog("OnAuthenticateRequest");
        return RQ_NOTIFICATION_CONTINUE;
    }

    // Process an RQ_AUTHENTICATE_REQUEST post-event.
    REQUEST_NOTIFICATION_STATUS
    OnPostAuthenticateRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pHttpContext );
        UNREFERENCED_PARAMETER( pProvider );
        WriteEventViewerLog("OnPostAuthenticateRequest");
        return RQ_NOTIFICATION_CONTINUE;
    }

    MyHttpModule()
    {
        // Open a handle to the Event Viewer.
        m_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
    }

    ~MyHttpModule()
    {
        // Test whether the handle for the Event Viewer is open.
        if (NULL != m_hEventLog)
        {
            // Close the handle to the Event Viewer.
            DeregisterEventSource( m_hEventLog );
            m_hEventLog = NULL;
        }
    }

private:

    // Create a handle for the event viewer.
    HANDLE m_hEventLog;

    // Define a method that writes to the Event Viewer.
    BOOL WriteEventViewerLog(LPCSTR szNotification)
    {
        // Test whether the handle for the Event Viewer is open.
        if (NULL != m_hEventLog)
        {
            // Write any strings to the Event Viewer and return.
            return ReportEvent(
                m_hEventLog,
                EVENTLOG_INFORMATION_TYPE, 0, 0,
                NULL, 1, 0, &szNotification, NULL );
        }
        return FALSE;
    }
};

// Create the module's class factory.
class MyHttpModuleFactory : public IHttpModuleFactory
{
public:
    HRESULT
    GetHttpModule(
        OUT CHttpModule ** ppModule, 
        IN IModuleAllocator * pAllocator
    )
    {
        UNREFERENCED_PARAMETER( pAllocator );

        // Create a new instance.
        MyHttpModule * pModule = new MyHttpModule;

        // Test for an error.
        if (!pModule)
        {
            // Return an error if the factory cannot create the instance.
            return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
        }
        else
        {
            // Return a pointer to the module.
            *ppModule = pModule;
            pModule = NULL;
            // Return a success status.
            return S_OK;
        }            
    }

    void Terminate()
    {
        // Remove the class from memory.
        delete this;
    }
};

// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
    DWORD dwServerVersion,
    IHttpModuleRegistrationInfo * pModuleInfo,
    IHttpServer * pGlobalInfo
)
{
    UNREFERENCED_PARAMETER( dwServerVersion );
    UNREFERENCED_PARAMETER( pGlobalInfo );

    // Set the request notifications and exit.
    return pModuleInfo->SetRequestNotifications(
        // Specify the class factory.
        new MyHttpModuleFactory,
        // Specify the event notifications.
        RQ_AUTHENTICATE_REQUEST,
        // Specify the post-event notifications.
        RQ_AUTHENTICATE_REQUEST
    );
}

Your module must export the RegisterModule function. You can export this function by creating a module definition (.def) file for your project, or you can compile the module by using the /EXPORT:RegisterModule switch. For more information, see IIS 7.0: Walkthrough: Creating a Request-Level HTTP Module By Using Native Code.

You can optionally compile the code by using the __stdcall (/Gz) calling convention instead of explicitly declaring the calling convention for each function.

Type

Description

Client

Requires IIS 7.0 on Windows Vista.

Server

Requires IIS 7.0 on Windows Vista.

Product

IIS 7.0

Header

Httpserv.h

© 2008 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Page view tracker