MS_ASPNETIdentityExternalLogin - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

ASP.NET Identityの倖郚ログむン

抂芁

倖郚ログむン・プロバむダを䜿甚しお倖郚ログむンを簡単に実装できるが、
プロトコルを理解しおラむブラリを自䜜するより数段楜ではあるものの
実際は、そんなに簡単ではなかったりする。

プロバむダのプロトコル

倖郚ログむン・プロバむダずしお䜿甚可胜な
クレヌムベヌス認蚌のプロトコルには、
以䞋のようなものがある。

プロトコル 状況
OAuth 珟時点では、OAuth正確には、OAuth 2.0が䞻流である暡様。OAuth 自䜓は認可プロトコルなので、倖郚ログむンは拡匵仕様である。
OpenID Connect その他、OpenID Connect に察応したラむブラリも拡充し぀぀ある。
OpenID Microsoft.Owin.Security.Google では、過去に OpenID を䜿甚しおいた。
WS-Federation, SAML WIFWindows Identity Foundationによっおサポヌト可胜ず思われる。

補足最新化: この蚘述の時点から状況は敎理され、
珟圚の倖郚ログむンは実質すべお OpenID Connect である。

プロバむダ 珟圚
Google OIDCaccounts.google.com の Discovery あり
Microsoft アカりント / Entra ID OIDC
AppleSign in with Apple OIDC
Facebook 独自寄りの OAuth 2.0Graph API
X旧 Twitter OAuth 2.0PKCE 必須。1.0a から移行枈み

OpenID Authentication 2.0無印 OpenIDは 2014 幎に廃止され、
珟存しない。

なお「OAuth 自䜓は認可プロトコルなので、倖郚ログむンは拡匵仕様」
ずいう指摘は極めお重芁である。
アクセス トヌクンを受け取れたこずは、認蚌の蚌明にならない
トヌクンは他所で盗んだものかもしれない。
だからこそ OpenID Connect の ID トヌクンが
必芁になった、ずいう経緯である。

ラむブラリ

Owin.Securityラむブラリ

  • Owin.Security 名前空間では、䞻芁 IdP の STS に察応したラむブラリが提䟛されおいる。
  • プロトコルは䞍問で、プロトコル・レベルの倉曎などもある暡様。
    ※ Microsoft.Owin.Security.Google では、過去に OpenID から OAuth 2.0 ぞの
    倉曎などがあった暡様。

Microsoft アカりント

  • ラむブラリ

    • NuGet Gallery | Microsoft.Owin.Security.MicrosoftAccount
      https://www.nuget.org/packages/Microsoft.Owin.Security.MicrosoftAccount/
      • Microsoft は「support the Microsoft Account authentication workflow」ず
        プロトコルを明蚀しおいない。
      • 2019 幎、久々詊したら、AADSTS70011: で wl.basic, wl.emails が
        discon の旚。この scope 倖せば取り敢えず動䜜した。
  • 蚭定

補足: wl.* は旧 Live Connect のスコヌプで、
Microsoft Graphopenid profile email User.Readに眮き換わった。
珟圚は **Microsoft ID プラットフォヌムv2.0 ゚ンドポむント**を䜿う。

Google アカりント

  • ラむブラリ

  • 蚭定

    • 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 Cloud Console にプロゞェクトを䜜成する。
      • 認蚌情報タブ ---> OAuth クラむアント ID を䜜成する。
      • 認蚌情報タブ ---> OAuth 同意画面を入力しお保存する。
        泚redirect_uri の末尟は、䜿甚するラむブラリによっお異なる。
      • ラむブラリ・タブ → API を有効にする。

移行メモ最新化: 手順䞭の

  • 「Google Developers Console」→ 珟圚は Google Cloud Console
  • 「Google+ API を有効にする」→ Google+ API は 2019 幎に廃止。
    珟圚は有効化䞍芁プロフィヌル取埗は OIDC の userinfo で行う

である。

Facebook アカりント

Twitter アカりント

  • ラむブラリ
    • NuGet Gallery | Microsoft.Owin.Security.Twitter
      https://www.nuget.org/packages/Microsoft.Owin.Security.Twitter/
      • NuGet 䞊の説明では、OAuth 2.0 を䜿甚しおいるもよう。
      • しかし、コチラの情報では、OAuth 1.0a らしいが 
        HTTP をサポヌトしないのも、OAuth 1.0a だから。ず考えるず蟻耄が合うのだが。

補足この疑問ぞの答え: OAuth 1.0a が正しい。
Microsoft.Owin.Security.Twitter は OAuth 1.0a を実装しおいる
リク゚スト トヌクン → 認可 → アクセス トヌクンの 3-legged。

OAuth 1.0a はメッセヌゞ自䜓に眲名する方匏のため、
眲名の察象に URLスキヌムを含むが入る。
HTTPS 前提の実装になっおいるのはこのためである
OAuth 2.0 は眲名をやめ、TLS に䟝存する蚭蚈に倉えた。

なお X旧 Twitterは珟圚 OAuth 2.0 + PKCE に移行しおおり、
䞊蚘ラむブラリは実質䜿えない。

Apple ID

  • 最近、Sign in with Appleがリリヌスされたが、
    NuGet 䞊にラむブラリは、ただ確認できない。
  • iOS 䞊での Native SDK が本䞞なので、
    Web から倖郚ログむンするための IdP ずしおは、あたり䜿甚されないかも。

補足最新化: 珟圚は
AspNet.Security.OAuth.Appleaspnet-contribが広く䜿われおいる。
たた、Apple はアプリ ストアの芏玄により
「他の倖郚ログむンを提䟛するなら Sign in with Apple も提䟛せよ」
ず求めおいるため、B2C では実質必須になっおいる。

実装䞊の癖ずしお、

  • クラむアント シヌクレットが JWTES256 眲名、最長 6 か月
    であり、定期的な再生成が芁る
  • 氏名・メヌルは初回認可時にしか返らない2 回目以降は空ので
    その堎で保存しなければならない
  • メヌル非公開を遞ばれるず @privaterelay.appleid.com の
    䞭継アドレスになる

がある。

その他のラむブラリ

OAuth甚ラむブラリ

Microsoft.Web.WebPages.OAuth.OAuthWebSecurity クラスには、
各サヌビスに応じお、アカりント認蚌を行うためのメ゜ッドが甚意されおいる。

項番 メ゜ッド 凊理内容
1 RegisterFacebookClient Facebook アカりントによる認蚌
2 RegisterGoogleClient Google アカりントによる認蚌
3 RegisterLinkedInClient LinkedIn アカりントによる認蚌
4 RegisterMicrosoftClient Microsoft アカりントによる認蚌
5 RegisterTwitterClient Twitter アカりントによる認蚌
6 RegisterYahooClient Yahoo アカりントによる認蚌

補足: これは MVC 4 時代の DotNetOpenAuth ベヌスの仕組みで、
珟圚は䜿甚しないDotNetOpenAuth 自䜓が開発終了。

OpenID Connect甚ラむブラリ

Microsoft.Owin.Security.OpenIdConnect では、
Microsoft Entra IDAzure Active Directoryずの、
OpenID Connect を䜿甚した認蚌連携がサポヌトされおいる暡様。

Google ぞのログむンは珟時点2016 幎ではサポヌトされおいない暡様。

補足最新化: 珟圚は Microsoft.AspNetCore.Authentication.OpenIdConnect
の AddOpenIdConnect() で、Google を含む
Discovery/.well-known/openid-configurationに察応した
任意の OP
ず連携できる。プロバむダ別のラむブラリは基本的に䞍芁になった。

.AddOpenIdConnect("google", o => {
    o.Authority = "https://accounts.google.com";
    o.ClientId = "...";
    o.ClientSecret = "...";
    o.ResponseType = "code";        // ← Implicit は䜿わない
    o.UsePkce = true;               // 既定 true
    o.Scope.Add("email");
    o.SaveTokens = true;
});

WS-Federation, SAML甚ラむブラリ

WIFの名前空間は、Microsoft.IdentityModel.Claims ず、
OWIN ミドルりェアMicrosoft.Owinず異なるため、
ASP.NET Identityずの連携具合が䞍明倚分連携しおいない。

補足最新化: ASP.NET Core には
Microsoft.AspNetCore.Authentication.WsFederation があり、
AD FS ずの連携が暙準でできる。
SAML は暙準では提䟛されず、
Sustainsys.Saml2 などのサヌドパヌティを䜿う
SAMLを実装する。を参照。

ASP.NET Core甚ラむブラリ

ASP.NET Core の情報は以䞋に纏たっおいる。

https://learn.microsoft.com/aspnet/core/security/authentication/social/

  • Google / Facebook / Microsoft / Twitter

※ こちらも、Owin.Security 同様に、MS 補Microsoft.AspNetCore.Authentication。

参考

  • 連茉Microsoft技術におけるアむデンティティ連携開発のいた - Build Insider
    http://www.buildinsider.net/web/msidentitydev
    • .NET で䜿えるアむデンティティ連携のためのラむブラリたずめ前・埌線
    • カスタム・アプリケヌションによる認蚌フロヌずプログラミング

実装

以䞋の手順に埓い、実装できる。

開始

倖郚ログむンは、
HttpUnauthorizedResult
の ActionResult を返すこずで開始する。通垞、redirect_uri は指定しない。

ハマり所

localhost

  • Microsoft アカりントでは、localhost も登録できるようになっおいる。
    しかし、Twitter では localhost が登録できないこずを確認した。

  • 埓っお、localhost を䜿甚できないログむン・プロバむダを䜿甚する堎合、
    URL, hosts, applicationhost.config の蚭定が必芁になる。

    • IIS Express で仮想サむトに耇数のホスト名を割り圓おる - しばやん雑蚘
      http://blog.shibayan.jp/entry/20130306/1362572283
    • なお、applicationhost.config の䜍眮が、VS2015 から倉わっおいるので泚意が必芁。

䌁業プロキシ環境

  • 䌁業プロキシ環境䞋で倖郚サヌビスに接続
    プロキシ環境䞋で倖郚サヌビスに接続する堎合、以䞋の実装・蚭定を行う必芁がある。

    • 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/
    • 埓っお、切り分けのために、䌁業プロキシの倖からテストするこずも重芁になる。

補足Google で蚱可すべきホスト: 䞊の掚枬は正しい。
OIDC ではブラりザが行く先ずサヌバが行く先が異なる。

経路 ホスト
ブラりザ認可 accounts.google.com
サヌバトヌクン取埗 oauth2.googleapis.com
サヌバDiscovery / JWKS accounts.google.com, www.googleapis.com
サヌバナヌザ情報 openidconnect.googleapis.com

ブラりザ偎だけを蚱可しおも、
サヌバ→ Google のトヌクン亀換で止たる。
これが「認蚌がうたく通らない」の正䜓である。
.well-known/openid-configuration を実際に取埗しお、
出おくる URL のホストを蚱可リストに入れるのが確実である。

サヌビス偎の仕様

サヌビス偎の

  • 仕様が䞍明確なこずや、
  • 仕様の倉曎が倚いずころがあり、

トラブる事が倚い。

䞍明確

プロトコルも䞍定で、䟋えば OAuth 2.0 の堎合、
詳しい仕様は蚘茉されおいないので
必芁に応じお分析が必芁になるOAuthによる倖郚ログむン認蚌の研究。

倉曎

以䞋のように、むンタヌフェむスの倉曎が倚数あったこずが報告されおいる。

たた、過去 Google の OpenID の倖郚ログむン・プロバむダが存圚しおおり、
最近 OAuth に眮き換えられたこずを考えるず、
将来的には、OAuth が、OpenID Connect に眮き換えられる。
などず蚀った可胜性はある。

補足: この予枬はその通りになった。
珟圚、䞻芁プロバむダの倖郚ログむンはすべお OIDC である。
Discovery に察応した汎甚の OIDC ミドルりェアを䜿っおおけば、
プロバむダ偎の倉曎に远埓しやすい。

テンプレヌト実装の課題

ほが、AccountController.ExternalLoginCallback 呚蟺で完結する。

E-mailアドレス

  • 倖郚ログむンをしおも、既定で E-mail アドレスは取埗できないので
    プロゞェクト・テンプレヌトも、既定で E-mail アドレスを自分で手入力する
    ずいう仕様で実装されおいる。

  • これでは、あたり倖郚ログむンの意味が無いのでE-mail アドレスの再入力が必芁、
    怜蚌枈みの E-mail アドレスを取埗できるように、
    連携先に、E-mail アドレスを芁求するように蚭定する。

  • これにより、連携先から、怜蚌枈みの E-mail アドレスを取埗できるようになるため、
    この E-mail アドレスを䜿甚しお、ナヌザ登録し、倖郚ログむンを远加すれば敎合性が取れる。

  • しかし、この状態で、E-mail Confirmation を実装しおいるず矛盟が生じる。

補足メヌルをキヌにしおはならない: 「連携先から取埗した
怜蚌枈みメヌルでナヌザを玐づける」ずいう蚭蚈には重倧な萜ずし穎がある。

  • email が怜蚌枈みずは限らない。
    OIDC の email_verified クレヌムを必ず確認するこず。
    falseたたは欠萜のメヌルで既存アカりントに玐づけるず、
    攻撃者が任意のメヌルを名乗っお他人のアカりントを乗っ取れる。
  • メヌルは倉わる。姓の倉曎・ドメむン移行で別人になる。

正しくは、iss + subプロバむダ + 䞍倉のナヌザ IDの組を
倖郚ログむンのキヌにするAspNetUserLogins テヌブルの
LoginProvider + ProviderKey がたさにこれ。
メヌルは衚瀺・照合の補助に留める。

Claimの保存

既定では Claim の保存凊理は実装されおいないので自分で実装する必芁がある。

await UserManager.AddClaimAsync(user.Id, claim);

管理画面の倖郚ログむンの削陀の意味

  • ExternalLoginCallback の条件分岐で、倖郚ログむンが有る時・無い時で動きが違う。

    • 倖郚ログむンは、アカりントに远加される。
    • アカりントが䜜成されおいない堎合は、
      • サむンアップアカりントの䜜成から行なう。
      • その埌、アカりントに倖郚ログむンを远加しおサむンむンする。
    • アカりントが䜜成されおる堎合は、倖郚ログむンをチェックする。
      • 倖郚ログむンが存圚しない堎合は、倖郚ログむンを远加しおサむンむンする。
      • 倖郚ログむンが存圚する堎合は、倖郚ログむンを远加しないでサむンむンする。
  • 別のログむン手段を持たない堎合は、倖郚ログむンを削陀できない仕様である暡様確認枈。

    • 最初にサむンアップしおあれば、倖郚ログむンを削陀できる。
    • 2 ぀以䞊の倖郚ログむンがあれば、倖郚ログむンを削陀できる。
    • 最初に倖郚ログむンした堎合、サむンアップできなくなる問題がある。
      • この堎合、ロヌカル・サむンむンできなくなる。
      • パスワヌド・リセットすれば、ロヌカル・サむンむンできるようになる。
      • これでロヌカル・サむンむンができるようになれば、倖郚ログむンを削陀できる。

補足この仕様は正しい: 「最埌のログむン手段は削陀させない」
ずいう挙動は意図的な安党策である。
削陀できおしたうず、ナヌザは自分のアカりントに
二床ずアクセスできなくなる 実質的なアカりント消倱。

同じ理由で、2FA を有効にしたら回埩コヌドを必ず提瀺する、
パスキヌのみのアカりントには代替手段を残す、ずいった
「締め出しlockout」ぞの配慮が芁る。
アカりント回埩の蚭蚈は、認蚌蚭蚈ず同じだけ重芁である。

倖郚ログむンが倱敗する

倖郚ログむンが倱敗するこずがあるらしい。

補足珟圚の定番の原因: 倖郚ログむンの「よく分からない倱敗」は、
珟圚ではほが次のいずれかである。

症状 原因
コヌルバックで Correlation failed. 盞関 Cookie が届いおいない。SameSite=None; Secure が必芁IdP から POST で戻る堎合
ロヌカルで動くが本番で倱敗 リバヌス プロキシ配䞋でスキヌムが http になる。UseForwardedHeaders が芁る
redirect_uri_mismatch 䞊ず同じ理由で redirect_uri が http:// で組み立おられおいる
断続的に倱敗 Data Protection の鍵が共有されおいない状態の暗号化・埩号に倱敗

特に 1 番目ず 2 番目は、ロヌドバランサ / コンテナ導入時に必ず螏む。

参考

Tsmatz


Tags: 移行, .NET開発, ASP.NET, ASP.NET MVC, ASP.NET Identity, OAuth, 認蚌基盀, セキュリティ

⚠ **GitHub.com Fallback** ⚠