Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

ASP.NET Identityは、
OAuthクレームベース認証のEndpoint追加をサポートしており、
これにより、JavaScript などの「非 .NET 環境」と連携させることもできる。

この処理は、SPAテンプレートの以下のエンドポイントに実装されている。  

ここでは、

  1. SPAテンプレートの動作確認を行い、
  2. MVCテンプレートの差分を確認した上で、
  3. OAuthのEndpoint追加に必要な実装を抽出し、
  4. MVCテンプレートにOAuthのEndpointを追加する手順を書き出し、
  5. その手順の妥当性を以下の検証手順によって検証した。

検証手順

前提

ここでは、以下のような前提のアプリケーションを構築するサンプルを示す。

#ref(): File not found: "goal.png" at page "ASP.NET IdentityのToken 認証"

認証サイト

Web アプリ

開発環境

認証サイト開発

プロジェクトの準備

  1. Visual Studio 2015 で、新規 ASP.NET Web アプリケーションを作成する。
  2. 「新しい ASP.NET プロジェクト」ダイアログで、以下を選択する。
    • テンプレート: MVC
    • 認証の変更: 個別のユーザー アカウント
  3. Visual Studio の「パッケージ マネージャー コンソール」で、以下のコマンドを実行する。
    Install-Package Microsoft.AspNet.WebApi
    Install-Package Microsoft.AspNet.WebApi.Owin
    Install-Package Microsoft.AspNet.WebApi.Cors

ApplicationOAuthProvider?の追加

Providers フォルダを作成し、以下の ApplicationOAuthProvider?.cs を作成する。

namespace [名前空間名].Providers
{
    public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
    {
        private readonly string _publicClientId;

        public ApplicationOAuthProvider(string publicClientId)
        {
            if (publicClientId == null)
            {
                throw new ArgumentNullException("publicClientId");
            }

            _publicClientId = publicClientId;
        }

        public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
        {
            if (context.ClientId == _publicClientId)
            {
                Uri expectedRootUri = new Uri(context.Request.Uri, "/");

                if (expectedRootUri.AbsoluteUri == context.RedirectUri)
                {
                    context.Validated();
                }
                else if (context.ClientId == "web")
                {
                    var expectedUri = new Uri(context.Request.Uri, "/");
                    context.Validated(expectedUri.AbsoluteUri);
                }
            }

            return Task.FromResult<object>(null);
        }
    }
}

Startup.Auth.csに追加実装

「// 以下、追加部分」~「// ここまで」の範囲。

public partial class Startup
{
    // 以下、追加部分
    // アプリケーションによる OAuthAuthorization の使用を有効にします。その後に Web API を保護できます
    static Startup()
    {
        PublicClientId = "web";

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            AuthorizeEndpointPath = new PathString("/Account/Authorize"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
    }

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    public static string PublicClientId { get; private set; }
    // ここまで

    // 認証設定の詳細については、http://go.microsoft.com/fwlink/?LinkId=301864 を参照してください
    public void ConfigureAuth(IAppBuilder app)
    {
        // 1 要求につき 1 インスタンスのみを使用するように DB コンテキスト、ユーザー マネージャー、サインイン マネージャーを構成します。
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

        // アプリケーションが Cookie を使用して、サインインしたユーザーの情報を格納できるようにします
        // また、サードパーティのログイン プロバイダーを使用してログインするユーザーに関する情報を、Cookie を使用して一時的に保存できるようにします
        // サインイン Cookie の設定
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // ユーザーがログインするときにセキュリティ スタンプを検証するように設定します。
                // これはセキュリティ機能の 1 つであり、パスワードを変更するときやアカウントに外部ログインを追加するときに使用されます。
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });            
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // 2 要素認証プロセスの中で 2 つ目の要素を確認するときにユーザー情報を一時的に保存するように設定します。
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

        // 2 つ目のログイン確認要素 (電話や電子メールなど) を記憶するように設定します。
        // このオプションをオンにすると、ログイン プロセスの中の確認の第 2 ステップは、ログインに使用されたデバイスに保存されます。
        // これは、ログイン時の「このアカウントを記憶する」オプションに似ています。
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

        // 以下、追加部分
        // アプリケーションがベアラ トークンを使用してユーザーを認証できるようにします
        app.UseOAuthBearerTokens(OAuthOptions);
        // ここまで

        // 次の行のコメントを解除して、サード パーティのログイン プロバイダーを使用したログインを有効にします
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //   consumerKey: "",
        //   consumerSecret: "");

        //app.UseFacebookAuthentication(
        //   appId: "",
        //   appSecret: "");

        //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
        //{
        //    ClientId = "",
        //    ClientSecret = ""
        //});
    }
}

OAuthClaimViewModel?の追加

Models フォルダに、クレームを返すための OAuthClaimViewModel?.cs を追加する。

namespace [名前空間名].Models
{
    // MeController アクションによって返されるモデル。
    public class OAuthClaimViewModel
    {
        public string Hometown { get; set; }
    }
}

Web アプリ開発

参考


Tags: :ASP.NET, :ASP.NET Identity

Special thanks go to maegawa-san for his support.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS