使用公司代理

时间:2018-04-02 22:14:02

标签: asp.net-core proxy azure-active-directory openid

我有一个ASPNET Core 2应用程序,我试图使用OpenId使用Azure AD进行身份验证。我只是在ASPNET Core 2模板中选择单一组织身份验证的样板代码,因此没有自定义代码。我按照文章here.

由于代理,应用程序无法从Azure AD应用程序获取元数据。如果我只是将其粘贴到浏览器中,则相同的URL会返回数据。

我得到的错误是:

  

HttpRequestException:响应状态代码不表示成功: 407(需要代理身份验证)

     

System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()   IOException:IDX10804:无法从以下文件中检索文档:' https://login.microsoftonline.com/my-tenant-id/.well-known/openid-configuration'。

     

Microsoft.IdentityModel.Protocols.HttpDocumentRetriever + d__8.MoveNext()

我有另一个ASPNET 4.5.2应用程序,在以下代码中设置代理后,我可以使用与上面相同的Azure AD应用程序执行身份验证:

System.Net.HttpWebRequest.DefaultWebProxy = new WebProxy
        {
            Address = new Uri("http://my-company-proxy:8080"),
            Credentials = new NetworkCredential
            {
                UserName = "proxyusername",
                Password = "proxypassword"
            }
        };

所以基本上我的问题是通过ASPNET Core 2中的代理身份验证。

我已经尝试过Microsoft.AspNetCore.Proxy包。它几乎破碎,对我不起作用。此外,我尝试在machine.config中添加代理条目(这实际上不是4.5.2应用程序所必需的),但这也不起作用。我相信过去的公司代理应该是非常微不足道的,但到目前为止看起来并不像。

请帮忙。

2 个答案:

答案 0 :(得分:7)

Tratcher的评论指出了我正确的方向,我得到了它的工作,但只是为了帮助每个人,下面是你需要做的:

  builder.AddOpenIdConnect(options => options.BackchannelHttpHandler = new HttpClientHandler
        {
            UseProxy = true,
            Proxy = new WebProxy
            {
                Credentials = new NetworkCredential
                {
                    UserName = "myusername",
                    Password = "mypassword"
                },
                Address = new Uri("http://url:port")
            }
        });

答案 1 :(得分:0)

  

在Full .net框架中,设置代理正在使用配置设置   但是要在.net核心中使用HTTP代理,你必须实现   IWebProxy接口。

Microsoft.AspNetCore.Proxy是代理中间件,它用于不同的目的(设置反向代理)而不是http代理。请参阅此article以获取更多详细信息

在.net核心中实现webproxy,

public class MyHttpProxy : IWebProxy
    {

        public MyHttpProxy()
        {
           //here you can load it from your custom config settings 
            this.ProxyUri = new Uri(proxyUri);
        }

        public Uri ProxyUri { get; set; }

        public ICredentials Credentials { get; set; }

        public Uri GetProxy(Uri destination)
        {
            return this.ProxyUri;
        }

        public bool IsBypassed(Uri host)
        {
            //you can proxy all requests or implement bypass urls based on config settings
            return false; 

        }
    }


var config = new HttpClientHandler
{
    UseProxy = true,
    Proxy = new MyHttpProxy()
};

//then you can simply pass the config to HttpClient
var http = new HttpClient(config)

结帐https://msdn.microsoft.com/en-us/library/system.net.iwebproxy(v=vs.100).aspx