読者です 読者をやめる 読者になる 読者になる

ASP.NET Identity - プロキシ環境下で外部サービスによるユーザ認証を行う

asp.net-identity

ローカルの開発環境などプロキシを使っている環境下で、ASP.NET Identity を使って外部サービスによるユーザ認証を行うには、サーバ間通信の際にプロキシの設定を行う必要があるのですが、それはどこでするの?ってお話です。

たとえば Google の OAuth 2.0 の場合、GoogleOAuth2AuthenticationOptions の BackchannelHttpHandler プロパティに、プロキシの情報を設定した WebRequestHandler を設定します。

// Startup.Auth.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.Google;
using Owin;

namespace WebApp {
    public partial class Startup {
        public void ConfigureAuth(IAppBuilder app) {
            // クッキーを使った認証を有効にする
            app.UseCookieAuthentication(new CookieAuthenticationOptions {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = CookieAuthenticationDefaults.LoginPath,
            });
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // プロキシ
            var proxy = new WebProxy {
                // 認証情報を設定
                Credentials = new NetworkCredential("USER_NAME","PASSWORD"),
            };

            // GoogleのOAuth 2.0を有効にする
            app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions {
                // サーバ間通信で使用するWebRequestHandlerを指定
                BackchannelHttpHandler = new WebRequestHandler {
                    // プロキシ情報を設定して、使用するように
                    Proxy = proxy,
                    UseProxy = true,
                },
                ClientId = "CLIENT_ID",
                ClientSecret = "CLIENT_SECRET",
            });
        }
    }
}

他のサービスの場合も、オプションクラスに BackchannelHttpHandler というプロパティがあるので同じように設定すればよさそうです。 たとえば Facebook は FacebookAuthenticationOptions に、Microsoft の場合は MicrosoftAccountAuthenticationOptions に BackchannelHttpHandler というプロパティがあります。