Share via


IWMSAuthenticationCallback.OnAuthenticateComplete (C#)

banner art

Previous Next

IWMSAuthenticationCallback.OnAuthenticateComplete (C#)

The OnAuthenticateComplete method is implemented by the server and called by the plug-in to report the result of the authentication process.

Syntax

  

Parameters

AuthResult

Member of the WMS_AUTHENTICATION_RESULT enumeration type that contains the result of the authentication process. This must be one of the following values.

Value Description
WMS_AUTHENTICATION_SUCCESS Notifies the server that authentication has succeeded.
WMS_AUTHENTICATION_DENIED Notifies the server that authentication has been denied.
WMS_AUTHENTICATION_CONTINUE Notifies the server that the authentication process is not complete, and that the server must request more data from the user.
WMS_AUTHENTICATION_ERROR Notifies the server that an error occurred during the authentication process.

ChallengeBlob

object containing a binary large object (BLOB). This value is only relevant when the AuthResult parameter contains WMS_AUTHENTICATION_CONTINUE. The server passes the BLOB, unaltered, to the client. If you are creating a custom authentication plug-in, the value you supply is specific to the type of authentication process that the plug-in implements. For example, a Digest Authentication plug-in passes the realm to the client, but an anonymous authentication plug-in does not pass a value.

Context

object containing a value defined by the server to identify which call to IWMSAuthenticationContext.Authenticate the plug-in is responding to when it calls OnAuthenticateComplete. You must pass this value back unaltered.

Return Values

This method does not return a value.

If this method fails, it throws an exception.

Number Description
0x80070057 Context is null.
0x80070057 Context is an unknown type.
0x80070057 Context is could not be queried by the server.
0x80070057 The server could not obtain the authentication context.

Remarks

The server calls the IWMSAuthenticationContext.Authenticate method to authenticate a client. The plug-in calls the OnAuthenticateComplete method to send the results of the authentication process to the server.

Example Code

// This sample implementation of the Authenticate method
// uses a digest authentication scheme.
public void Authenticate(
    object ResponseBlob,
    IWMSContext pUserCtx,
    IWMSContext pPresentationCtx,
    IWMSCommandContext pCommandContext,
    IWMSAuthenticationCallback pCallback,
    object Context)
{
    string AUTH_QOP = "auth";
    string AUTH_REALM = "RealmName";

    Encoding Enc = Encoding.Unicode;
    string strNonce = GenerateNonce();
    byte[] Response;
    byte[] Challenge = Enc.GetBytes("");

    try
    {
        Response = (byte[])ResponseBlob;
        if( Response.Length == 0 )
        {
            // The client requested authentication; prepare the
            // challenge response to send to the client.
            Challenge = Enc.GetBytes("realm=\"" + AUTH_REALM +
                                   "\",qop=\"" + AUTH_QOP +
                                   "\",nonce=\"" + strNonce +
                                   "\",charset=utf-8,algorithm=MD5-sess");

            m_Result =
                    WMS_AUTHENTICATION_RESULT.WMS_AUTHENTICATION_CONTINUE;
        }
        else
        {
            // The client has responded to the authentication
            // challenge; verify the client credentials.
            IWMSContext CommandReq;
            string strResponse;
            string strUserName;
            string strRealm;
            string strURI;
            string strCNonce;
            string strNonceCount;
            string strChalResponse;
            string strCommandName;
            string strUserHash;
            string strA1Hash;
            string strA2Hash;
            string strDigestHash;
            bool bOK;

            strResponse = Enc.GetString(Response);
            SplitResponse(strResponse, out strUserName, out strRealm,
                          out strURI, out strCNonce, out strNonceCount,
                          out strChalResponse);

            pCommandContext.GetCommandRequest(out CommandReq);
            CommandReq.GetStringValue("@ WMS_COMMAND_NAME", 153,
                                      out strCommandName,
                                      Convert.ToInt32(
       WMS_CONTEXT_OPTIONS.WMS_CONTEXT_GET_PROPERTY_STRING_BY_REFERENCE));

            // Retrieve the user hash from the user database.
            strUserHash = GetUserHash(strUserName);
            strA1Hash = GetHash(strUserHash + ":" +
                                strNonce + ":" + strCNonce);
            strA2Hash = GetHash(strCommandName + ":" + strURI);
            strDigestHash = GetHash(strA1Hash + ":" + strNonce +
                                    ":" + strNonceCount + ":" +
                                    strCNonce + ":" + AUTH_QOP +
                                    ":" + strA2Hash);

            // If the computed digest hash is equal to the
            // client response, the user can be authenticated.
            if( strDigestHash == strChalResponse )
            {
                bOK = LogonUser("media_client", "", "password",
                    LOGON32_LOGON_NETWORK,
                    LOGON32_PROVIDER_DEFAULT,
                    out m_hToken);
                if( bOK )
                    m_Result =
                     WMS_AUTHENTICATION_RESULT.WMS_AUTHENTICATION_SUCCESS;
                else
                    m_Result =
                       WMS_AUTHENTICATION_RESULT.WMS_AUTHENTICATION_ERROR;
            }
            else
            {
                m_Result =
                      WMS_AUTHENTICATION_RESULT.WMS_AUTHENTICATION_DENIED;
            }
        }
    }
    catch(Exception e)
    {
        // TODO: Handle exceptions.
    }
    finally
    {
        // Report the results of the authentication
        // challenge to the server.
        pCallback.OnAuthenticateComplete(m_Result, Challenge, Context);
    }
}

Requirements

Reference: Add a reference to Microsoft.WindowsMediaServices.

Namespace: Microsoft.WindowsMediaServices.Interop.

Assembly: Microsoft.WindowsMediaServices.dll.

Library: WMSServerTypeLib.dll.

Platform: Windows Server 2003, Enterprise Edition; Windows Server 2003, Datacenter Edition; Windows Server 2008.

See Also

Previous Next