「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>ASP.NET Identity]] * 目次 [#fb080ecc] #contents *概要 [#ma4a5581] 外部ログイン・プロバイダを使用して外部ログインを簡単に実装できるが、~ (プロトコルを理解してライブラリを自作するより数段楽ではあるものの)~ 実際は、そんなに簡単ではなかったりする。 **プロバイダのプロトコル [#ff43edeb] 外部ログイン・プロバイダとして使用可能な[[クレームベース認証]]のプロトコルには、以下のようなものがある。 ***[[OAuth]] [#xe763625] -現時点では、[[OAuth]](正確には、[[OAuth]] 2.0)が主流である模様。 -[[OAuth]]自体は、認可プロトコルなので、外部ログインは拡張仕様である。詳しくは[[コチラ>OAuthによる外部ログイン(認証)の研究#jf7626f6]]を参照。 ***[[OpenID Connect]] [#tfa0bfaa] その他、[[OpenID Connect]]に対応したライブラリも拡充しつつある。 ***[[OpenID]] [#m7d886a9] Microsoft.Owin.Security.Googleでは、過去に[[OpenID]]を使用していた。 ***[[WS-Federation]], [[SAML]] [#o81f2ff0] [[WIF]] (Windows Identity Foundation) によってサポート可能と思われる。 *ライブラリ [#yfc29b34] **Owin.Securityライブラリ [#j7ec63cb] -Owin.Security名前空間では、主要IdpのSTSに対応したライブラリが提供されてる。 -プロトコルは不問で、プロトコル・レベルの変更などもある模様。~ ※ Microsoft.Owin.Security.Googleでは、過去に[[OpenID]]から[[OAuth]]2.0への変更などがあった模様。 ***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」とプロトコルを明言していない。 ---2019年、久々試したら、AADSTS70011: で wl.basic, wl.emails がdisconの旨。このscope外せば取り敢えず動作した。 -設定 --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を使用しているもよう。 ---と思いきや、NuGetのサイトの表示がメンテナンスされていないだけっぽい。 ---[[この辺を見ると、現在は、OIDCを使用している>PPID#te919d5e]]らしい。 -設定 --[[ASP.NET MVC]] 5 で [[OAuth]] 2.0 を使用して Google 認証を行う方法: ある SE のつぶやき~ http://fnya.cocolog-nifty.com/blog/2014/03/aspnet-mvc-5-oa.html --GoogleのOAuth2.0を使ってプロフィールを取得【PHP】 - FaMirror Project~ http://famirror.hateblo.jp/entry/2015/12/18/180000 --サマリ ---Google Developers Consolにプロジェクトを作成する。 ---認証情報タブ ---> OAuth クライアント ID を作成する。 ---認証情報タブ ---> OAuth 同意画面を入力して保存する。~ (注:redirect_uriの末尾は、使用するライブラリによって異なる。) ---ライブラリ・タブ → 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を使用しているもよう。 -設定 --・・・ -変更 --ASP.NET MVC5 OWIN Facebook authentication suddenly not working - Stack Overflow~ http://stackoverflow.com/questions/22364442/asp-net-mvc5-owin-facebook-authentication-suddenly-not-working ---[Announcement] Facebook 3.0.1 and lower no longer work · Issue #38 · aspnet/AspNetKatana~ https://github.com/aspnet/AspNetKatana/issues/38 ---NuGet Gallery | Microsoft.Owin.Security.Facebook 3.1.0~ https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/ ***Twitter アカウント [#t22d3c15] -ライブラリ --NuGet Gallery | Microsoft.Owin.Security.Twitter 3.0.1~ https://www.nuget.org/packages/Microsoft.Owin.Security.Twitter/ ---NuGet上の説明では、OAuth 2.0を使用しているもよう。 ---しかし、[[コチラの情報>WebAPIの認証#zabb2cc5]]では、OAuth 1.0aらしいが・・・?~ HTTPをサポートしないのも、OAuth 1.0aだから。と考えると辻褄が合うのだが。 -設定 --ASP.NET MVC 5 で Twitter 認証を行う方法: ある SE のつぶやき~ http://fnya.cocolog-nifty.com/blog/2014/03/aspnet-mvc-5-tw.html ***Apple ID [#z585303f] -最近、[[Sign in with Apple>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Sign%20in%20with%20Apple]]がリリースされたが、NuGet上にライブラリは、まだ確認できない。 -iOS上でのNative SDKが本丸なので、Webからの外部ログインのIdPとしては、あまり使用されないかも。 -iOS上でのNative SDKが本丸なので、Webから外部ログインするためのIdPとしては、あまり使用されないかも。 **その他のライブラリ [#r649d114] ***[[OAuth]]用ライブラリ [#da7bdcb6] Microsoft.Web.WebPages.OAuth.OAuthWebSecurity クラスには、~ 各サービスに応じて、アカウント認証を行うためのメソッドが用意されている。 |項番|メソッド|処理内容|h |1|RegisterFacebookClient|Facebook アカウントによる認証| |2|RegisterGoogleClient|Google アカウントによる認証| |3|RegisterLinkedInClient|LinkedIn アカウントによる認証| |4|RegisterMicrosoftClient|Microsoft アカウントによる認証| |5|RegisterTwitterClient|Twitter アカウントによる認証| |6|RegisterYahooClient|Yahoo アカウントによる認証| -Using OAuth Providers with MVC 4 | The ASP.NET Site~ https://www.asp.net/mvc/overview/older-versions/using-oauth-providers-with-mvc ***[[OpenID Connect]]用ライブラリ [#mb93f920] Microsoft.Owin.Security.OpenIdConnectでは、~ Azure Active Directoryとの、[[OpenID Connect]]使用した認証連携がサポートされている模様。 -OWIN security components in ASP.NET: OpenID Connect! | .NET Web Development and Tools Blog~ https://blogs.msdn.microsoft.com/webdev/2014/03/28/owin-security-components-in-asp-net-openid-connect/ -IdM実験室 --[AAD/ASP.NET] OpenID Connectを使ってAADでログオンする~ http://idmlab.eidentity.jp/2014/05/aadaspnet-openid-connectaad.html --(続)response_mode=fragment編~ http://idmlab.eidentity.jp/2014/05/aadaspnet-openid-connectaadresponsemode.html Googleへのログインは現時点(2016年)ではサポートされていない模様。 -asp.net - OpenIdConnect Owin login with google - Stack Overflow~ http://stackoverflow.com/questions/25423898/openidconnect-owin-login-with-google ***[[WS-Federation]], [[SAML]]用ライブラリ [#e017f191] [[WIF]]の名前空間は、Microsoft.IdentityModel.Claimsと、~ OWINミドルウェア(Microsoft.Owin)と異なるため、ASP.NET Identityとの連携具合が不明(多分連携していない)。 -方法: WIF を使用してクレーム対応 ASP.NET MVC Web アプリケーションをビルドする~ https://msdn.microsoft.com/ja-jp/library/hh291061.aspx ***[[ASP.NET Core]]用ライブラリ [#q7d83e72] [[ASP.NET Core]]の情報は以下に、纏まっている。 https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/social/ -google~ https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/social/google-logins -facebook~ https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/social/facebook-logins -microsoft~ https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/social/microsoft-logins -twitter~ https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/social/twitter-logins ※ こちらも、[[Owin.Security>#j7ec63cb]]同様に、MS製(Microsoft.AspNetCore.Authentication)。 **参考 [#t7400751] -連載:Microsoft技術におけるアイデンティティ連携開発のいま - Build Insider~ http://www.buildinsider.net/web/msidentitydev --.NETで使えるアイデンティティ連携のためのライブラリまとめ(前・後編) ---http://www.buildinsider.net/web/msidentitydev/01 ---http://www.buildinsider.net/web/msidentitydev/02 --カスタム・アプリケーションによる認証フローとプログラミング~ http://www.buildinsider.net/web/msidentitydev/03 *実装 [#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 **開始 [#r0877e57] 外部ログインは、[[HttpUnauthorizedResult>https://msdn.microsoft.com/ja-jp/library/system.web.mvc.httpstatuscoderesult.aspx]]のActionResultを返すことで開始する。通常、redirect_uriは指定しない。 **ハマり所 [#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 --この設定を行うと、下記の「ClientのWebアプリ」からのWebアクセスは、~ 企業プロキシ経由でインターネットにルーティングされるようになる。 -企業プロキシのフィルタリング --どこから、どこに、アクセスしようとしているかを確認する必要がある。~ [[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が異なるのだと思われる。) ---https://www.google.com/ --従って、切り分けのために、企業プロキシの外からテストすることも重要になる。 **サービス側の仕様 [#x97fd655] サービス側の -仕様が不明確なことや、 -仕様の変更が多いことろがあり、 トラブる事が多い。 ***不明確 [#o2fa50b7] プロトコルも不定で、例えば[[OAuth]] 2.0の場合、詳しい仕様は記載されていないので[[必要に応じて分析が必要になる>OAuthによる外部ログイン(認証)の研究#jf7626f6]]。 ***変更 [#e81fb52b] 以下のように、インターフェイスの変更が多数あったことが報告されている。 -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アドレスの再入力が必要になる)、~ 検証済みの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アドレスを使用して、ユーザ登録し、外部ログインを追加れば整合性が取れる。 -しかし、この状態で、E-mail Confirmationを実装していると矛盾が生じる。 ***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/ ***管理画面の外部ログインの削除の意味 [#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/ --asp.net mvc - MVC 5 Owin Facebook Auth results in Null Reference Exception - Stack Overflow~ http://stackoverflow.com/questions/19564479/mvc-5-owin-facebook-auth-results-in-null-reference-exception *参考 [#p6743d35] **Tsmatz [#m3acc6a5] -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/ **[[ASP.NET Core Identity の 外部ログイン>ASP.NET Core Identity#hef2f3a0]] [#yfa3aa4f] ---- Tags: [[:.NET開発]], [[:ASP.NET]], [[:ASP.NET MVC]], [[:ASP.NET SPA]], [[[[ASP.NET Web API]]]], [[:ASP.NET Identity]], [[:OAuth]], [[:認証基盤]], [[:セキュリティ]]