[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>ASP.NET Identity]] * 目次 [#fb080ecc] #contents *概要 [#ma4a5581] 外部ログイン・プロバイダを使用して外部ログインを簡単に実装できるが、~ (プロトコルを理解してライブラリを自作するより数段楽ではあるものの)~ 実際は、そんなに簡単ではなかったりする。 **プロバイダのプロトコル [#ff43edeb] 外部ログイン・プロバイダの使用する[[クレームベース認証]]は、~ 現時点では、[[OAuth]](正確には、OAuth2.0)が主流である模様。 *実装 [#n710287b] 以下の手順に従い、実装できる。 -Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#) | The ASP.NET Site~ https://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on **ライブラリ [#j7ec63cb] ***Microsoft アカウント [#j12cae65] -NuGet Gallery | Microsoft.Owin.Security.MicrosoftAccount 3.0.1~ https://www.nuget.org/packages/Microsoft.Owin.Security.MicrosoftAccount/ >Microsoftは、「support the Microsoft Account authentication workflow」とプロトコルを明言していない。 -ASP.NET Identity を使って Microsoft アカウントで認証する~ http://kendik.hatenablog.com/entry/2014/08/25/020152 ***Google アカウント [#n8dd8918] -NuGet Gallery | Microsoft.Owin.Security.Google 3.0.1~ https://www.nuget.org/packages/Microsoft.Owin.Security.Google/ >今の所、OAuth 2.0を使用しているもよう。 -[[ASP.NET MVC]] 5 で [[OAuth]] 2.0 を使用して Google 認証を行う方法: ある SE のつぶやき~ http://fnya.cocolog-nifty.com/blog/2014/03/aspnet-mvc-5-oa.html --プロジェクトを作成(ちょうどGCPを使っていたのでそのプロジェクトを流用) --認証情報タブ→OAuth クライアント ID を作成する。 --認証情報タブ→OAuth 同意画面を入力して保存 --ライブラリ・タブ→Social API→Google+ APIを有効にする。 ***Facebook アカウント [#lce246f9] -NuGet Gallery | Microsoft.Owin.Security.Facebook 3.0.1~ https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/ >今の所、OAuth 2.0を使用しているもよう。 ***Twitter アカウント [#t22d3c15] -NuGet Gallery | Microsoft.Owin.Security.Twitter 3.0.1~ https://www.nuget.org/packages/Microsoft.Owin.Security.Twitter/ >今の所、OAuth 2.0を使用しているもよう。 -ASP.NET MVC 5 で Twitter 認証を行う方法: ある SE のつぶやき~ http://fnya.cocolog-nifty.com/blog/2014/03/aspnet-mvc-5-tw.html **ハマり所 [#j015e60f] ***localhost [#m958ce47] -Microsoft アカウントでは、localhostも登録できるようになっている。~ しかし、Twitterではlocalhostが登録できないことを確認した。 -従って、localhostを使用できないログイン・プロバイダを使用する場合、~ URL, hosts, applicationhost.configの設定が必要になる。 --IIS Express で仮想サイトに複数のホスト名を割り当てる - しばやん雑記~ http://blog.shibayan.jp/entry/20130306/1362572283 --なお、applicationhost.configの位置が、VS2015から変わっているので注意が必要。 ---IIS Expressでlocalhost以外のアドレスでアクセスする方法 - なか日記~ http://blog.nakajix.jp/entry/2014/09/19/022536 ***プロキシ環境 [#rd84d228] -プロキシ環境下で外部サービスに接続~ プロキシ環境下で外部サービスに接続する場合、以下の実装・設定を行う必要がある。 --ASP.NET Identity - プロキシ環境下で外部サービスによるユーザ認証を行う~ http://ichiroku11.hatenablog.jp/entry/2014/04/09/224050 --これだとインターネットにルーティングされるので、localhostへのプロキシ使用をOFFにする。~ 従って、ローカルのFQDN名はプロキシを利用しないで済むlocalhost設定が可能で無いと難しい。 -企業プロキシのフィルタリングについて。 --どこにアクセスしようとしているかを確認する必要がある。 --例えば、Googleでは、をフィルタ解除しているだけでは認証がうまく通らなかった。 ---https://www.google.com/ --従って、切り分けのために、企業プロキシの外からテストすることも重要になる。 **サービス側の変更 [#x97fd655] サービス側の -仕様が不明確なことや、 -仕様の変更が多いことろがあり、 トラブる事が多い。 -Using Google and LinkedIn Accounts for Your .net MVC 5 Site’s Authentication:~ Tips and Tricks and the error externalLoginCallback?error=access_denied | C# is all around, by Riccardo Moschetti~ https://riccardo-moschetti.org/2014/08/25/using-google-accounts-for-your-net-mvc-5-sites-authentication-tips-and-tricks-and-the-error-externallogincallbackerroraccess_denied/ また、過去Googleの[[OpenID]]の外部ログイン・プロバイダが存在しており、最近[[OAuth]]に置き換えられたことを考えると、~ 将来的には、[[OAuth]]が、[[OpenID Connect]]に置き換えられる。などと言った可能性はある。 -ASP.NET MVC 5 で OpenID を使用して Google 認証を行う方法: ある SE のつぶやき~ http://fnya.cocolog-nifty.com/blog/2014/03/aspnet-mvc-5-op.html --サイトにパスワードを保存する必要なし ― Microsoft、Google等がユーザー認証の新規格、OpenID Connectをサポート | TechCrunch Japan~ http://jp.techcrunch.com/2014/02/27/20140226openid-foundation-launches-openid-connect-identity-protocol-with-support-from-google-microsoft-others/ **テンプレート実装の課題 [#n62c8e4f] ほぼ、AccountController.ExternalLoginCallback周辺で完結する。 ***E-mailアドレス [#f50ba421] -外部ログインをしても、既定でE-mailアドレスは取得できないので~ プロジェクト・テンプレートも、既定でE-mailアドレスを自分で手入力するという仕様で実装されている。 -しかし、この状態で、E-mail Confirmationを実装していると矛盾が生じる。 -なので、検証済みのE-mailアドレスを取得できるように、連携先に、E-mailアドレスを要求するように設定する。 --c# - Get E-mail of User Authenticated with Microsoft Account in ASP.NET Identity - Stack Overflow~ http://stackoverflow.com/questions/22229593/get-e-mail-of-user-authenticated-with-microsoft-account-in-asp-net-identity --twitterのoauthを使ってみる(emailも取得) - Qiita~ http://qiita.com/kite_999/items/e0ab8c52f918bbb02cfd -これにより、連携先から、検証済みのE-mailアドレスを取得できるようになるため、~ この、E-mailアドレスを使用して、ユーザ登録し、外部ログインを追加れば整合性が取れる。 ***Claimの保存 [#f97d1bb0] 既定ではClaimの保存処理は実装されていないので自分で実装する必要がある。 await UserManager.AddClaimAsync(user.Id, claim); -参考: --ASP.NET Identity : External Login カスタマイズ (claim, scope, access token などの活用) – Tsmatz~ https://blogs.msdn.microsoft.com/tsmatsuz/2014/06/15/asp-net-identity-external-login-claim-scope-access-token/ >-----(引用)-----~ さて、上記の Startup.Auth.cs で追加した External Login の Claim も、同様にデータベースに保持しておかないと以降の処理で参照できません。この設定をおこなうには、例えば、Controllers/AccountController.cs の ExternalLoginConfirmation に下記太字の通り追記して、External Login の Claim も保存します。ここでは、強制的に External Login で取得した Claim をデータベースに (Claim として) 保持していますが、上図のように UI で確認してから登録させるような実装も可能でしょう。なお、ここで登場する External Cookie は、この ExternalLoginConfirmation と同時に消されてしまうので、この永続化の処理は、必ずこのタイミングで実行してください。(以降の処理で External Login の Claim を参照することはできません。)~ -----(引用)----- ***サインアップと外部ログインの競合 [#idd3eb14] 外部ログインした後に、E-mailアドレスを使用してユーザ登録すると、~ ユーザIDの重複で、サインアップによりパスワード登録ができないため~ 通常ログインができなくなるという問題(?)もある。 ※ 先に、サインアップして、後で外部ログインを追加すればこの問題は起きない。 ***管理画面の外部ログインの削除の意味 [#l73abe1e] ExternalLoginCallbackの条件分岐で、外部ログインがある時とない時で動きが違う。~ 別のログイン手段を持たない場合は、外部ログインを削除できない仕様である模様(確認済)。 -サインアップしてあれば、外部ログインを削除できる。 -2つ以上の外部ログインがあれば、外部ログインを削除できる。 ***外部ログインが失敗する [#i1247215] -ASP.NET IdentityのSNS対応ではまったポイント | 眠るシーラカンスと水底のプログラマー~ http://coelacanth.jp.net/asp-net-identity%E3%81%AEsns%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%AF%E3%81%BE%E3%81%A3%E3%81%9F%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88/ --ASP.NET Identity : External Login カスタマイズ (claim, scope, access token などの活用) – Tsmatz~ https://blogs.msdn.microsoft.com/tsmatsuz/2014/06/15/asp-net-identity-external-login-claim-scope-access-token/ *参考情報 [#p6743d35] -ASP.NET Identity : External Login カスタマイズ (claim, scope, access token などの活用) – Tsmatz~ https://blogs.msdn.microsoft.com/tsmatsuz/2014/06/15/asp-net-identity-external-login-claim-scope-access-token/