LoginSignup
6
11

More than 5 years have passed since last update.

.NET FrameworkアプリでID/Password認証ありのproxyを突破する

Last updated at Posted at 2019-03-05

やりたかったコト

  • BoxのSDKを使って、Box APIに接続しているが、そのコネクションを、認証ありのプロキシ経由にしたかった
  • BoxのSDKは、.NET Core で使用していた

できなかったコト

やったコト

  • .NET Coreじゃなきゃダメ、ってことがなかったので、.NET Frameworkで動くようにし、App.configでproxyの設定ができるようにした

App.configでのproxy設定方法

proxy設定なしの場合

defaultProxy項目自体なくてもよい

  <system.net>
    <defaultProxy enabled="false" useDefaultCredentials="false">
    </defaultProxy>
  </system.net>

proxy設定あり(認証なし)の場合

参考: https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/file-schema/network/proxy-element-network-settings

  <system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
        <proxy usesystemdefault="true"/>
    </defaultProxy>
  </system.net>

proxy設定あり(認証あり)の場合

参考: https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/file-schema/network/module-element-network-settings

  <appSettings>
    <add key="http_proxy_url" value="http://[IP]:[Port]"/>
    <add key="proxy_user" value="hoge"/>
    <add key="proxy_pass" value="fuga"/>
  </appSettings>
  <system.net>
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="Sample.MyProxyModule, Sample"/>
    </defaultProxy>
  </system.net>

moduleの実装(Sample.MyProxyModule)

  • Sample/MyProxyModule.cs
    • 後述のApp.configから設定値を取得しています
using System;
using System.Net;
using System.Configuration;

namespace Sample
{
    public class MyProxyModule : IWebProxy
    {
        /// <summary>
        /// 認証情報
        /// </summary>
        public ICredentials Credentials { get; set; }

        /// <summary>
        /// ProxyServer名を返却
        /// </summary>
        /// <param name="destination"></param>
        /// <returns></returns>
        public Uri GetProxy(Uri destination)
        {
            return new Uri(ConfigurationManager.AppSettings["http_proxy_url"]);
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public AuthProxyModule()
        {
            try
            {
                Credentials = new NetworkCredential(ConfigurationManager.AppSettings["proxy_user"], ConfigurationManager.AppSettings["proxy_pass"]);
            }
            catch (Exception ex)
            {
                // 適宜
                throw;
            }
        }

        /// <summary>
        /// host でプロキシサーバーを使用しない場合は true。それ以外の場合は false。
        /// </summary>
        public bool IsBypassed(Uri host)
        {
            return false;
        }
    }
}
  • Sample/App.config
    • 認証情報をとりあえず、ここで設定。これは色々と方法あると思うので適宜。
  <appSettings>
    <add key="http_proxy_url" value="http://[IP]:[Port]"/>
    <add key="proxy_user" value="hoge"/>
    <add key="proxy_pass" value="fuga"/>
  </appSettings>

参考にさせていただきました。ありがとうございます:pray_tone2:
nap3/relayCredentials: 認証のプロキシの情報を中継するモジュール
c# - Is it possible to specify proxy credentials in your web.config? - Stack Overflow

6
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
11