「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
外部ログイン・プロバイダを使用して外部ログインを簡単に実装できるが、
(プロトコルを理解してライブラリを自作するより数段楽ではあるものの)
実際は、そんなに簡単ではなかったりする。
プロバイダのプロトコル †
外部ログイン・プロバイダとして使用可能なクレームベース認証のプロトコルには、以下のようなものがある。
その他、OpenID Connectに対応したライブラリも拡充しつつある。
Microsoft.Owin.Security.Googleでは、過去にOpenIDを使用していた。
WIF (Windows Identity Foundation) によってサポート可能と思われる。
ライブラリ †
Owin.Securityライブラリ †
- Owin.Security名前空間では、主要IdpのSTSに対応したライブラリが提供されてる。
- プロトコルは不問で、プロトコル・レベルの変更などもある模様。
※ Microsoft.Owin.Security.Googleでは、過去にOpenIDからOAuth2.0への変更などがあった模様。
Microsoft アカウント †
Google アカウント †
- サマリ
- Google Developers Consolにプロジェクトを作成する。
- 認証情報タブ ---> OAuth クライアント ID を作成する。
- 認証情報タブ ---> OAuth 同意画面を入力して保存する。
(注:redirect_uriの末尾は、使用するライブラリによって異なる。)
- ライブラリ・タブ → Social API → Google+ APIを有効にする。
Facebook アカウント †
Twitter アカウント †
- NuGet上の説明では、OAuth 2.0を使用しているもよう。
- しかし、コチラの情報では、OAuth 1.0aらしいが・・・?
HTTPをサポートしないのも、OAuth 1.0aだから。と考えると辻褄が合うのだが。
Apple ID †
最近、Sign in with Appleがリリースされたが、NuGet上にライブラリは、まだ確認できない。
その他のライブラリ †
Microsoft.Web.WebPages?.OAuth.OAuthWebSecurity? クラスには、
各サービスに応じて、アカウント認証を行うためのメソッドが用意されている。
項番 | メソッド | 処理内容 |
1 | RegisterFacebookClient? | Facebook アカウントによる認証 |
2 | RegisterGoogleClient? | Google アカウントによる認証 |
3 | RegisterLinkedInClient? | LinkedIn? アカウントによる認証 |
4 | RegisterMicrosoftClient? | Microsoft アカウントによる認証 |
5 | RegisterTwitterClient? | Twitter アカウントによる認証 |
6 | RegisterYahooClient? | Yahoo アカウントによる認証 |
Microsoft.Owin.Security.OpenIdConnect?では、
Azure Active Directoryとの、OpenID Connect使用した認証連携がサポートされている模様。
Googleへのログインは現時点(2016年)ではサポートされていない模様。
WIFの名前空間は、Microsoft.IdentityModel?.Claimsと、
OWINミドルウェア(Microsoft.Owin)と異なるため、ASP.NET Identityとの連携具合が不明(多分連携していない)。
ASP.NET Coreの情報は以下に、纏まっている。
https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/social/
※ こちらも、Owin.Security同様に、MS製(Microsoft.AspNetCore?.Authentication)。
参考 †
実装 †
以下の手順に従い、実装できる。
開始 †
外部ログインは、HttpUnauthorizedResultのActionResult?を返すことで開始する。通常、redirect_uriは指定しない。
ハマり所 †
localhost †
- Microsoft アカウントでは、localhostも登録できるようになっている。
しかし、Twitterではlocalhostが登録できないことを確認した。
- 従って、localhostを使用できないログイン・プロバイダを使用する場合、
URL, hosts, applicationhost.configの設定が必要になる。
- なお、applicationhost.configの位置が、VS2015から変わっているので注意が必要。
企業プロキシ環境 †
- 企業プロキシ環境下で外部サービスに接続
プロキシ環境下で外部サービスに接続する場合、以下の実装・設定を行う必要がある。
- 企業プロキシのフィルタリング
- どこから、どこに、アクセスしようとしているかを確認する必要がある。
OAuthに詳しくなると、以下にアクセスしていることが解るようになる。
- User AgentからClientのWebアプリ(自分の開発中のWebアプリ)
- User AgentからAuthorization ServerのWebアプリ(サービス側のWebアプリ)
- ClientのWebアプリからAuthorization ServerのWebアプリ
- ClientのWebアプリからResource ServerのWebAPI
- User AgentからResource ServerのWebAPI
- 例えば、Googleアカウントでは、下記をフィルタ解除しているだけでは認証がうまく通らなかった。
(恐らく仲介コードを使用し、Access TokenやClaimを取得
するための各エンドポイントのURLが異なるのだと思われる。)
- 従って、切り分けのために、企業プロキシの外からテストすることも重要になる。
サービス側の仕様 †
サービス側の
- 仕様が不明確なことや、
- 仕様の変更が多いことろがあり、
トラブる事が多い。
不明確 †
プロトコルも不定で、例えばOAuth 2.0の場合、詳しい仕様は記載されていないので必要に応じて分析が必要になる。
変更 †
以下のように、インターフェイスの変更が多数あったことが報告されている。
また、過去GoogleのOpenIDの外部ログイン・プロバイダが存在しており、最近OAuthに置き換えられたことを考えると、
将来的には、OAuthが、OpenID Connectに置き換えられる。などと言った可能性はある。
テンプレート実装の課題 †
ほぼ、AccountController?.ExternalLoginCallback?周辺で完結する。
E-mailアドレス †
- 外部ログインをしても、既定でE-mailアドレスは取得できないので
プロジェクト・テンプレートも、既定でE-mailアドレスを自分で手入力するという仕様で実装されている。
- これでは、あまり外部ログインの意味が無いので(E-mailアドレスの再入力が必要になる)、
検証済みのE-mailアドレスを取得できるように、連携先に、E-mailアドレスを要求するように設定する。
- これにより、連携先から、検証済みのE-mailアドレスを取得できるようになるため、
この、E-mailアドレスを使用して、ユーザ登録し、外部ログインを追加れば整合性が取れる。
- しかし、この状態で、E-mail Confirmationを実装していると矛盾が生じる。
Claimの保存 †
既定ではClaimの保存処理は実装されていないので自分で実装する必要がある。
await UserManager.AddClaimAsync(user.Id, claim);
管理画面の外部ログインの削除の意味 †
- ExternalLoginCallback?の条件分岐で、
外部ログインが有る時・無い時で動きが違う。
- アカウントが作成されていない場合は、
- サインアップ(アカウントの作成)から行なう。
- その後、アカウントに外部ログイン追加してサインインする。
- アカウントが作成されてる場合は、外部ログインをチェックする。
- 外部ログインが存在しない場合は、外部ログイン追加してサインインする。
- 外部ログインが存在する場合は、外部ログイン追加しないでサインインする。
- 別のログイン手段を持たない場合は、
外部ログインを削除できない仕様である模様(確認済)。
- 最初にサインアップしてあれば、外部ログインを削除できる。
- 2つ以上の外部ログインがあれば、外部ログインを削除できる。
- 最初に外部ログインした場合、サインアップできなくなる問題がある。
- この場合、ローカル・サインインできなくなる。
- パスワード・リセットすれば、ローカル・サインインできるようになる。
- これでローカル・サインインができるようになれば、外部ログインを削除できる。
外部ログインが失敗する †
外部ログインが失敗することがあるらしい。
参考 †
Tsmatz †
Tags: :.NET開発, :ASP.NET, :ASP.NET MVC, :ASP.NET SPA, ASP.NET Web API, :ASP.NET Identity, :OAuth, :認証基盤, :セキュリティ