【问题标题】:Keeping HTTP Basic Authentification alive while being redirected在重定向时保持 HTTP 基本身份验证处于活动状态
【发布时间】:2012-12-12 23:11:54
【问题描述】:

我们正在使用具有基本身份验证的 Web 服务。 一切都很好,直到 Web 服务的所有者实现了平衡服务。 这只是将请求重定向到不同的 Web 服务实例。

问题是被重定向后基本认证失败。 出现“请求身份验证凭据未通过”异常。

附加信息:

  1. 我们必须手动创建请求。

        var req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(Settings.Default.HpsmServiceAddress));
    
        req.Headers.Add("Authorization", "Basic aaaaaaaaaaa");
        req.PreAuthenticate = true;
        req.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
        req.UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)";
        req.KeepAlive = false;
    
        ServicePointManager.Expect100Continue = false;
    
        req.ContentType = "text/xml; charset=utf-8";
        req.Method = "POST";
        req.Accept = "gzip,deflate";
        req.Headers.Add("SOAPAction", actionName);
        byte[] buffer = Encoding.UTF8.GetBytes(envelop);
        Stream stm = req.GetRequestStream();
        stm.Write(buffer, 0, buffer.Length);
        stm.Close();
    
        WebResponse response = req.GetResponse();
        string strResponse = new StreamReader(response.GetResponseStream()).ReadToEnd();
        response.Dispose();
    
  2. 我们使用 HTTP 307 重定向进行重定向

【问题讨论】:

    标签: c# web-services http http-headers basic-authentication


    【解决方案1】:

    按照 MSDN 获取 HttpWebRequest.AllowAutoRedirect 属性我发现了这个:

    授权标头在自动重定向时被清除和 HttpWebRequest 自动尝试重新验证 重定向的位置。实际上,这意味着应用程序不能 如果将自定义身份验证信息放入 Authorization 标头中 可能会遇到重定向。相反,应用程序必须 实现并注册一个自定义认证模块。这 System.Net.AuthenticationManager 和相关类用于 实现自定义身份验证模块。这 AuthenticationManager.Register 方法注册一个自定义 认证模块。

    解决方案是编写一个自定义身份验证模块。

    这是我发现的:

    http://msdn.microsoft.com/en-us/library/system.net.authenticationmanager.aspx

    这里是 AllowAutoRedirect 属性页面:

    http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.allowautoredirect.aspx

    更新

    您可以尝试使用 CredentialCache 而不是将标头添加到 webrequest 吗?

    CredentialCache myCache = new CredentialCache();
    
    myCache.Add(
    new Uri("http://www.contoso.com/"),"Basic",new NetworkCredential(UserName,SecurelyStoredPassword));
    req.Credentials = myCache;
    

    【讨论】:

    • Tnx。它看起来像解决方案,但仍然不起作用。 =(我添加了这几行:req.AllowAutoRedirect = true; AuthenticationManager.Unregister("Basic"); AuthenticationManager.Register(new CustomBasic()); req.Credentials = new NetworkCredential("user", "password"); CustomBasic() 只是链接示例中的代码。它适用于服务实例,但在重定向后失败。有什么想法我做错了吗?Tnx。
    • 它有效!!!!您能否评论一下有什么区别以及为什么通常的凭据不起作用?
    【解决方案2】:

    确实,CredentialCache 工作正常。但是,如果您想添加多个基本身份验证凭据(例如,如果您知道重定向),您可以使用我制作的以下功能:

    private void SetNetworkCredential(Uri uriPrefix, string authType, NetworkCredential credential)
    {
        if (request.Credentials == null)
        {
            request.Credentials = new CredentialCache();
        }
    
        if (request.Credentials.GetCredential(uriPrefix, authType) == null)
        {
            (request.Credentials as CredentialCache).Add(uriPrefix, authType, credential);
        }
    }
    

    我希望它对未来的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2016-11-02
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多