Возможно, это будет очень наивный вопрос о классе 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;
}