2

我们有一个场景,我们试图在 Winform WebBrowser 控件中打开 CRM,每次打开它时,它都会在弹出窗口中要求进行身份验证。同样,当我们尝试打开一个新表单(在 IE 中打开)时,它会再次要求进行身份验证。

这里的问题是用户通过本地凭据登录到机器(Windows 7、IE 9),我们不能使用集成身份验证。我们已经在应用程序中捕获了用户凭据,即我们知道用户名和密码,有没有一种方法可以将凭据传递给 Webbrowser 控件和 IE,这样它就不会向用户询问凭据。

感谢您的帮助。

谢谢。阿比纳夫

4

1 回答 1

0

如果您从浏览器登录并进行身份验证,您将看到以下 cookie 被存储:

饼干

从理论上讲,跨请求保留这些 cookie 应该可以防止 crm 在您每次打开 WebBrowser 控件的新实例时要求进行身份验证。

您可以使用 WebBrowser.Document.Cookie 属性为控件设置 Cookie。

要在第一次身份验证后检索 cookie,您需要使用以下代码:

[SecurityCritical]
public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)
{
    uint pchCookieData = 0;

    string url = UriToString(uri);

    uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;

    //Gets the size of the string builder
    if (NativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))
    {
        pchCookieData++;

        StringBuilder cookieData = new StringBuilder((int)pchCookieData);

        //Read the cookie
        if (NativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))
        {
            DemandWebPermission(uri);

            return cookieData.ToString();
        }
    }

    int lastErrorCode = Marshal.GetLastWin32Error();

    if (throwIfNoCookie || (lastErrorCode != (int)NativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS))
    {
        throw new Win32Exception(lastErrorCode);
    }

    return null;
}

private static void DemandWebPermission(Uri uri)
{
    string uriString = UriToString(uri);

    if (uri.IsFile)
    {
        string localPath = uri.LocalPath;

        new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand();
    }
    else
    {
        new WebPermission(NetworkAccess.Connect, uriString).Demand();
    }
}

private static string UriToString(Uri uri)
{
    if (uri == null)
    {
        throw new ArgumentNullException("uri");
    }

    UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString);

    return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), 2083).ToString();
}



internal sealed class NativeMethods
{
#region enums

    public enum ErrorFlags
    {
        ERROR_INSUFFICIENT_BUFFER = 122,
        ERROR_INVALID_PARAMETER = 87,
        ERROR_NO_MORE_ITEMS = 259
    }

    public enum InternetFlags
    {
        INTERNET_COOKIE_HTTPONLY = 8192, //Requires IE 8 or higher
        INTERNET_COOKIE_THIRD_PARTY = 131072,
        INTERNET_FLAG_RESTRICTED_ZONE = 16
    }

#endregion

#region DLL Imports

    [SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved); 

#endregion
}

我通常不会发布我自己没有尝试过的代码,但我目前无法访问 On-Prem 环境。我很想知道这是否有效,所以如果您尝试一下,请告诉我。

于 2013-09-11T18:07:46.493 回答