【问题标题】:Authenticate with Azure AD using ASPNET Core 2 from behind Corporate Proxy从企业代理后面使用 ASPNET Core 2 向 Azure AD 进行身份验证
【发布时间】:2018-04-02 22:14:02
【问题描述】:

我有一个 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 应用程序不需要这些条目),但这也不起作用。我相信通过公司代理应该是非常简单的,但目前看来还不是这样。

【问题讨论】:

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


    【解决方案1】:

    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")
                }
            });
    

    【讨论】:

    • 谢谢!我支持公司代理,这对我有用。在我的情况下,我省略了 Credentials 属性,因为我们的代理使用 Windows 身份验证,并且我的 IIS Express 进程正在以我的身份运行。
    • 我需要绕过代理所以使用了这个,但是将 UseProxy 设置为 false。
    【解决方案2】:

    在完整的 .net 框架中设置代理是使用配置设置 入口,但要在 .net 核心中使用 HTTP 代理,您必须实现 IWebProxy 接口。

    Microsoft.AspNetCore.Proxy 是代理中间件,它有不同的用途(设置反向代理),而不是作为 http 代理。有关更多详细信息,请参阅此 article

    要在 .net core 中实现 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

    【讨论】:

    • WebProxy 类应该足够了,不需要自定义实现。
    • 从上面的代码中计算出代理设置后,您可以将它们分配给 OpenIdConnectOptions.Backchannel。
    • 谢谢大家。就像 Tratcher 提到的,我不需要实现自己的代理。关键是为 OpenIdConnectOptions.BackchannelHttpHandler 分配一个 HttpClientHandler(它也可以保存 WebProxy 的实例)。我被卡住了,因为我认为我无法传递 HttpClientHandler,因为 HttpClient Creation 是 OpenId 中间件的内部。所以 Tratcher 的上述评论回答了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2019-09-02
    • 2018-07-21
    相关资源
    最近更新 更多