Error: Autenticación de Proxy a través de IAuthenticate puede fallar en dirección URL segura

Importante: la revisión descrita en este artículo se ha sustituido por la actualización crítica 813951.
Para obtener información adicional acerca de esta actualización, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
813951 no puede acceder a su correo electrónico de MSN cuenta o autenticarse en un sitio Web desde varios programas

Síntomas

En un host de control de explorador Web, cuando inicialmente se desplazan a una dirección URL segura a través de un servidor proxy que requiere autenticación, y si proporciona las credenciales de autenticación a través de la interfaz IAuthenticate , puede recibir un mensaje de error "Página no encontrada". Nota importante:
Este hotfix contiene un error que se trata en el siguiente artículo de Microsoft Knowledge Base: 813951 - error: Proxy de autenticación a través de IAuthenticate puede fallar en dirección URL segura.

Solución

Existe un hotfix disponible desde Microsoft. Sin embargo, esta revisión se diseñó para corregir únicamente el problema que se describe en este artículo. Aplíquela sólo a sistemas que experimenten este problema específico. Esta revisión podría ser sometida a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere a la próxima actualización de software que contenga este hotfix.

Si la revisión está disponible para su descarga, hay una sección de "Descarga de revisión disponible" en la parte superior de este artículo de Knowledge Base. Si esta sección no aparece, póngase en contacto con el servicio al cliente de Microsoft y soporte técnico para obtener la revisión.

Nota: Si se producen problemas adicionales o si se requiere cualquier otra solución, será necesario crear una solicitud de revisión independiente. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no califican para esta revisión específica. Para obtener una lista completa de los números de teléfono de servicio al cliente de Microsoft o para crear una solicitud de servicio independiente, visite el siguiente sitio Web de Microsoft:Nota: El formulario de "Descarga de Hotfix disponible" muestra los idiomas para los que el Hotfix está disponible. Si no ve su idioma, es porque no hay una revisión para ese idioma.

La versión en inglés de esta revisión tiene los atributos de archivo (o posterior) que figuran en la tabla siguiente. Las fechas y horas de estos archivos se muestran en hora universal coordinada (UTC). Al ver la información del archivo, se convierte en hora local. Para encontrar la diferencia entre la hora UTC y la hora local, utilice la ficha zona horaria en la herramienta fecha y hora del Panel de Control.
   Date        Time      Version        Size     File name
---------------------------------------------------------
11-19-2002 23:22:38 6.0.2800.1139 483,328 Urlmon.dll


Estado

Microsoft ha confirmado que se trata de un error en los productos de Microsoft que se enumeran al principio de este artículo.

Más información

Como las credenciales de proxy no se almacena correctamente cuando pasen a través de una conexión segura en esta situación, se produce el error.

Pasos para reproducir el comportamiento

  1. Configurar un servidor proxy.
  2. Crear un nombre de cuenta de prueba y, a continuación, cree una contraseña que tenga permiso para utilizar el servidor proxy.
  3. Crear una aplicación de clase de Microsoft Foundation Classes (MFC) CHtmlView y, a continuación, implementar la IAuthenticate y las interfaces IServiceProvider en un sitio de control personalizado. La interfaz IServiceProvider permite el control del explorador Web para descubrir la interfaz IAuthenticate .

    El ejemplo de código siguiente es específica de clases de Microsoft Foundation 7.0:

    MyOleControlSite.h
    #include <afxocc.h>#include <afxhtml.h>

    class CHtmlControlSite : public COleControlSite
    {
    public:
    CHtmlControlSite(COleControlContainer* pParentWnd);
    ~CHtmlControlSite();

    CHtmlView* GetView() const;

    BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)
    STDMETHOD(ShowContextMenu)(DWORD, LPPOINT, LPUNKNOWN, LPDISPATCH);
    STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*);
    STDMETHOD(ShowUI)(DWORD, LPOLEINPLACEACTIVEOBJECT,
    LPOLECOMMANDTARGET, LPOLEINPLACEFRAME, LPOLEINPLACEUIWINDOW);
    STDMETHOD(HideUI)(void);
    STDMETHOD(UpdateUI)(void);
    STDMETHOD(EnableModeless)(BOOL);
    STDMETHOD(OnDocWindowActivate)(BOOL);
    STDMETHOD(OnFrameWindowActivate)(BOOL);
    STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
    STDMETHOD(TranslateAccelerator)(LPMSG, const GUID*, DWORD);
    STDMETHOD(GetOptionKeyPath)(OLECHAR **, DWORD);
    STDMETHOD(GetDropTarget)(LPDROPTARGET, LPDROPTARGET*);
    STDMETHOD(GetExternal)(LPDISPATCH*);
    STDMETHOD(TranslateUrl)(DWORD, OLECHAR*, OLECHAR **);
    STDMETHOD(FilterDataObject)(LPDATAOBJECT , LPDATAOBJECT*);
    END_INTERFACE_PART(DocHostUIHandler)

    DECLARE_INTERFACE_MAP()
    };

    class CMyOleControlSite : public CHtmlControlSite
    {
    public:
    CMyOleControlSite(COleControlContainer *pCnt = NULL):CHtmlControlSite(pCnt) {}

    BEGIN_INTERFACE_PART(Authenticate, IAuthenticate)

    STDMETHODIMP Authenticate(
    HWND __RPC_FAR *phwnd,
    LPWSTR __RPC_FAR *pszUsername,
    LPWSTR __RPC_FAR *pszPassword);

    END_INTERFACE_PART(Authenticate)


    BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider)
    STDMETHODIMP QueryService(REFGUID guid, REFIID iid, LPVOID * ppv);
    END_INTERFACE_PART(ServiceProvider)

    DECLARE_INTERFACE_MAP();
    };

    MyOleControlSite.cpp
    #include "stdafx.h"#include "MyOleControlSite.h"

    BEGIN_INTERFACE_MAP(CMyOleControlSite, CHtmlControlSite)
    INTERFACE_PART(CMyOleControlSite, IID_IAuthenticate, Authenticate)
    INTERFACE_PART(CMyOleControlSite, IID_IServiceProvider, ServiceProvider)
    END_INTERFACE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CMyOleControlSite: IAthenticate::IUnknown methods

    ULONG CMyOleControlSite::XAuthenticate::AddRef()
    {
    METHOD_PROLOGUE(CMyOleControlSite, Authenticate)
    return pThis->ExternalAddRef();
    }

    ULONG CMyOleControlSite::XAuthenticate::Release()
    {
    METHOD_PROLOGUE(CMyOleControlSite, Authenticate)
    return pThis->ExternalRelease();
    }

    HRESULT CMyOleControlSite::XAuthenticate::QueryInterface(REFIID riid, void **ppvObj)
    {
    METHOD_PROLOGUE(CMyOleControlSite, Authenticate)
    HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
    return hr;
    }


    /////////////////////////////////////////////////////////////////////////////
    // CMyOleControlSite: Authenticate methods

    STDMETHODIMP CMyOleControlSite::XAuthenticate::Authenticate(
    HWND __RPC_FAR *phwnd,
    LPWSTR __RPC_FAR *pszUsername,
    LPWSTR __RPC_FAR *pszPassword)
    {
    METHOD_PROLOGUE(CMyOleControlSite, Authenticate)

    // add code from next step

    return S_OK;
    }

    //
    // IServiceProvider
    //

    ULONG CMyOleControlSite::XServiceProvider::AddRef()
    {
    METHOD_PROLOGUE(CMyOleControlSite, ServiceProvider)
    return pThis->ExternalAddRef();
    }

    ULONG CMyOleControlSite::XServiceProvider::Release()
    {
    METHOD_PROLOGUE(CMyOleControlSite, ServiceProvider)
    return pThis->ExternalRelease();
    }

    HRESULT CMyOleControlSite::XServiceProvider::QueryInterface(REFIID riid, void **ppvObj)
    {
    METHOD_PROLOGUE(CMyOleControlSite, ServiceProvider)
    HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
    return hr;
    }

    STDMETHODIMP CMyOleControlSite::XServiceProvider::QueryService(REFGUID sid, REFIID iid, LPVOID * ppv)
    {
    METHOD_PROLOGUE(CMyOleControlSite, ServiceProvider)

    if (sid == IID_IAuthenticate || iid == IID_IAuthenticate) {
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppv);
    } else {
    *ppv = NULL;
    }

    return E_NOINTERFACE;
    }

    ProxyTestView.h
    class CProxyTestView : public CHtmlView{
    ...
    BOOL CreateControlSite(COleControlContainer* pContainer,
    COleControlSite** ppSite, UINT nID, REFCLSID clsid);

    ProxyTestView.cpp
    BOOL CProxyTestView::CreateControlSite(COleControlContainer* pContainer, COleControlSite** ppSite, UINT nID, REFCLSID clsid)
    {
    ASSERT(ppSite != NULL);
    *ppSite = new CMyOleControlSite(pContainer);
    return TRUE;
    }

  4. En la implementación de la interfaz IAuthenticate , proporcione un nombre de usuario y una contraseña, como se muestra en el ejemplo siguiente:
    STDMETHODIMP CMyOleControlSite::XAuthenticate::Authenticate(     HWND __RPC_FAR *phwnd,
    LPWSTR __RPC_FAR *pszUsername,
    LPWSTR __RPC_FAR *pszPassword)
    {
    METHOD_PROLOGUE(CMyOleControlSite, Authenticate)

    CString strUsername = "Altoid/LocalAltoid";
    CString strPassword = "Test123";

    WCHAR *wszDlgUser = (WCHAR *) CoTaskMemAlloc(255 * sizeof(WCHAR));
    WCHAR *wszDlgPassword = (WCHAR *) CoTaskMemAlloc(255 * sizeof(WCHAR));
    MultiByteToWideChar(GetACP(), 0, (const char*)strUsername, -1, wszDlgUser, 255);
    MultiByteToWideChar(GetACP(), 0, (const char*)strPassword, -1, wszDlgPassword, 255);
    *pszUsername = wszDlgUser;
    *pszPassword = wszDlgPassword;
    *phwnd = NULL;

    return S_OK;
    }

  5. En la función OnInitialUpdate , mover a la "acerca de: en blanco" página:
    void CProxyTestView::OnInitialUpdate(){
    CHtmlView::OnInitialUpdate();
    Navigate2(_T("about:blank"),NULL,NULL);
    }

  6. Agregar un elemento de menú y, a continuación, agregar un controlador para desplazarse a una dirección URL segura, tal como se muestra en el ejemplo siguiente:
    void CProxyTestView::OnActionTest(){
    Navigate2(_T("https://www.etrade.com"),NULL,NULL);
    }

  7. Generar y probar el proyecto. Verá que la página no se encuentra. Si modifica la página de modo que se desplaza a una dirección URL no segura o si visita la dirección URL segura después de visitar la dirección URL no segura, el movimiento se realiza correctamente.

Referencias

Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
Error de 320153 : implementación de IAuthenticate para omitir el nombre de usuario o contraseña
Para obtener más información acerca de la clase COleControlSite , visite el siguiente sitio Web de Microsoft Developer Network:
Para obtener más información acerca de la interfaz IAuthenticate , visite el siguiente sitio Web de Microsoft Developer Network:
Para obtener más información acerca de cómo desarrollar soluciones basadas en Web para Microsoft Internet Explorer, visite los siguientes sitios Web de Microsoft:
Propiedades

Id. de artículo: 329802 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios