Применяется ли единственный экземпляр NetworkCredential только к одному URI? - PullRequest
2 голосов
/ 05 февраля 2011

Возможно, это будет очень наивный вопрос о классе NetworkCredential.Извините за неопытность, пожалуйста ...

Я создаю NetworkCredential, используя имя пользователя, пароль и домен.Затем я использую HttpWebRequest для взаимодействия с URI.NetworkCredential используется для аутентификации на этом URI путем установки HttpWebRequest.Credentials.Это работало нормально.

Однако добавление некоторого перенаправления в микс вызвало проблемы.Теперь я возвращаю 401.Означает ли это, что мой учетный объект привязан только к определенному URI?Где это происходит?В классе NetworkCredential я не вижу, чтобы это происходило.

Возможно, процесс установки HttpWebRequest.Credentials связывает эти учетные данные только с URI, который был указан в конструкторе HttpWebRequest ...

Если это так, как можно обойти эту проблему?

К вашему сведению, схема аутентификации - Kerberos.Я бы использовал DefaultCredentials, за исключением того, что пользователь может использовать локальную учетную запись пользователя (не в Kerberos).Однако пользователь будет вводить в программу действительную учетную запись Kerberos (используя диалог входа в систему, который я написал).

Я написал метод, который будет проходить через перенаправления вручную, чтобы создать NetworkCredential, который указывает нато же имя хоста (но не точный URI), который я использую.Код ниже:

    /// <summary>
    /// Get a NetworkCredentials instance associated with location.
    /// </summary>
    /// <param name="location">A URI to test user credentials against.</param>
    /// <param name="userName">Username.</param>
    /// <param name="password">Password.</param>
    /// <param name="domain">Domain.</param>
    /// <param name="throwExceptions">Throws exceptions on error if true.</param>
    /// <returns>On success a NetworkCredential instance is returned.  If throwExceptions equals 
    /// true all exceptions will propogate up the stack, otherwise null is returned.</returns>
    public static NetworkCredential GetCredential(Uri location, string userName,
        SecureString password, string domain, bool throwExceptions = true)
    {
        NetworkCredential ret = null;
        try
        {
            Uri uri = location;
            bool redirected = false;
            do
            {
                HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;

                ret = new NetworkCredential(userName, password, domain);
                request.UseDefaultCredentials = false;
                request.Credentials = ret;

                request.AllowAutoRedirect = false;
                HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
                if (resp.StatusCode == HttpStatusCode.Redirect)
                {
                    uri = new Uri(resp.GetResponseHeader("Location"));
                    redirected = true;
                }
                else
                {
                    redirected = false;
                }
            } while (redirected);
        }
        catch
        {
            if (throwExceptions)
            {
                throw;
            }
            ret = null;
        }
        return ret;
    }

1 Ответ

2 голосов
/ 05 февраля 2011
       // NetworkCredential stores authentication to a single internet resource
       // supplies credentials in password-based authentication schemes such as basic, digest, NTLM, and Kerberos. 
       NetworkCredential networkCredential = new NetworkCredential("username", "password");

        WebRequest webRequest = HttpWebRequest.Create("www.foobar.com");
        webRequest.Credentials = networkCredential;

        // to use the same credential for multiple internet resources...
        CredentialCache credentialCache = new CredentialCache();
        credentialCache.Add(new Uri("www.foobar.com"), "Basic", networkCredential);
        credentialCache.Add(new Uri("www.example.com"), "Digest", networkCredential);

        // now based on the uri and the authetication, GetCredential method would return the 
        // appropriate credentials
        webRequest.Credentials = credentialCache;

Больше информации на здесь и здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...