Cutting Edge

ASP.NET MVC 4 のソーシャル ネットワークを利用した認証 (機械翻訳)

Dino Esposito

Dino Esposito私は物事を見るように、ユーザーを認証する必要がありますほとんどの Web サイト社会認証ゲートウェイを使用します。このコンテキストでは、社会認証ゲートウェイは Twitter や Facebook などの人気のソーシャル ネットワークに公開認証プラットフォームだけです。ASP.NET の初期の頃に戻ってだと思う場合は、ヘルプしますが、パスポート イニシアチブの背後にある考え方と今日の社会の認証ゲートウェイの間のいくつかの肖像に注意してくださいすることはできません。彼らは確かに、同じ事ではないが、両方のシナリオでは彼らを追跡する必要があります資格情報の数を減らすことによって、ユーザーの生活を容易に目標を認識することができます。

同じ資格情報セットを使用しての長所と短所があります。一方でそれはお客様のプライバシーの周りのセキュリティ バリアを下げます。常に同じユーザー名とパスワードを使用してより多くの時間をあなたの秘密を推測するハッカーを与えます。 同時に、一度ハッキングより多くの情報を公開します。その一方で、しかし、何度も繰り返し同じ資格情報を使用してそれを接続し、新しいサービスを試してみること容易します。ユーザー数をより迅速に、サービスに成功するためにより多くのチャンスがあることを意味成長を参照してくださいすることができますので、サービスの所有者がこれは素晴らしいことです。

一言で言えば、大規模なユーザー ベースを今日誘致を目指してより多くの Web サイトは独自の資格情報を選択するか社会的なネットワーク認証ゲートウェイ経由の登録の 2 倍のオプションを提供しています。傾向は、ASP.NET MVC 4 の最新バージョンで、アドホックな枠組みを社会的なネットワークの数によってユーザーを認証することは興味深いです。この記事では ASP.NET MVC 4 プロジェクト テンプレートから取得コードを確認します。社会的認証ゲートウェイは非常に詳細なプロトコルをすることが判明、オープン認証 (OAuth) プロトコルを使用してください。したがって、結果として得られるコードはまったくとるに足らなくない、いくつかそれ以上の説明が必要になる場合があります。

MVC 認証する最も簡単な方法

ASP.NET MVC は既に認証が含まれているコードのテンプレートからコーディングを開始するチャンスを与えます。ASP.NET MVC 4 を得るインターネット アプリケーション テンプレート社会ゲートウェイをサポートしています。次に、新しいインターネット アプリケーション プロジェクトがあることと仮定しましょう。コードの最初のビルドでは、何も特別な発生します。ページで図 1外部認証サービスまだ有効になっているないことを通知します。


図 1 外部認証サービスが構成されていない場合、ASP.NET MVC 4 テンプレート

サポートされているサービスのいずれかのいくつか光を global.asax の分離コード ファイルに変更できます。ASP.NET MVC 4 でプロジェクトを App_Start フォルダーの初期化タスクを実行する xxxConfig クラスに含めることをお勧めします。このようなクラスは、アプリケーションのブートス トラップ コードを整理する静的メソッドの明白なコンテナーです。スナップショットはここにあります。

protected void Application_Start()
{  ...  AuthConfig.RegisterAuth();}

RegisterAuth メソッドには Facebook や Twitter など他のサイトから自分のアカウントを使用してユーザー ログインするコードが含まれます。

public static class AuthConfig
{
public static void RegisterAuth()
  {
    OAuthWebSecurity.RegisterTwitterClient(
      consumerKey: yourTwitterAppKey
      consumerSecret: yourTwitterAppSecret);
    OAuthWebSecurity.RegisterFacebookClient(
      appId: yourFacebookAppKey,
    appSecret: yourFacebookAppSecret);
  }
}

OAuthWebSecurity クラスは、Web ページのフレームワークから来るし、Microsoft.Web.WebPages.OAuth 名前空間内に位置しています。DotNetOpenAuth (DNOA) ライブラリに実装されて、OAuth プロトコルの主要な機能をこのクラスをラップ (を参照してください dotnetopenauth.net)。

社会的なネットワークに対してユーザーを認証するために、社会的なネットワーク内のアプリケーションを作成する必要があります。だからあなたの Twitter のアプリケーションと Twitter や Facebook からを介してあなたのサイト内のユーザーを認証するために Facebook のアプリケーション必要があります。最も可能性の高いサイトと同じ名前をトゥウィッター/Facebook のアプリケーションを作成し、Web サイトに戻ってリンクするように構成します。参照されているここトゥウィッター/Facebook のアプリケーション本当に本格的なアプリケーション。 また、特別な開発している­Twitter、Facebook などのソーシャル ネットワークにプログラムでアクセスするオペラ トークン。過去の分割払いこの Facebook のプログラミングに専用の列のかなり詳細なのこの側面を覆われました。この記事の目的のためトゥウィッター/Facebook のアプリケーションの文字列のペアで構成されています — として、キーとその他の秘密として知られている 1 つ知られています。キーとシークレット ソーシャルアプリケーションと一意に関連付けられています。キーを渡すことによって OAuthWebSecurity を初期化し、各社会的なネットワークの秘密をサポートします。

RegisterTwitterClient と RegisterFacebookClient への呼び出しを追加するだけで、これら登録オプションとしてボタンを表示するサンプル プロジェクトの UI を変更します。「ログイン」ボタンをクリックすると、彼女は認証を続行するには、トゥウィッター/Facebook サイトにリダイレクトされます。それはすべて正常に動作する場合彼女は、元のサイトにリダイレクトされます、ASP.NET は認証されたユーザーとして認識されます。

右は非常に単純なことのように聞こえるか?まあ、多くの具体的な詳細をボンネットの下です。

OAuth ルート認証を取ってください。

ユーザーが Twitter のボタンをクリックすると、サイト アカウント/ExternalLogin に移動します。(コードを AccountController.cs ファイルにあります) メソッドのコードを見てみましょうがある:

public ActionResult ExternalLogin(String provider, 
  String returnUrl)
{
  return new ExternalLoginResult(provider,
    Url.Action("ExternalLoginCallback",
    new { ReturnUrl = returnUrl }));
}

ExternalLoginResult クラス ラッパーであるために本当に接触する認証ゲートウェイの仕事を次のコードの一種です。

OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);

ExternalLoginResult クラスも、AccountController.cs ファイルで見つかったヘルパー クラスです。プロジェクト テンプレート コードにプロバイダーの名前、ボタンの name 属性で見ることによって解決したことに注意してください。

<button type="submit"
  name="provider"
  value="@p.AuthenticationClient.ProviderName"
  title="Log in using your @p.DisplayName account">
  @p.DisplayName
</button>

一日の終わりには、RequestAuthentication メソッド (Twitter、Facebook やその他のサポートされているプロバイダーのいずれか) の認証プロバイダーの URL を返す名前を受け取ります。既定では、OAuthWebSecurity は次のプロバイダーをサポートします。Twitter、Facebook、LinkedIn の Google、マイクロソフト、ヤフー。内部的には、このメソッドは、タスクを実行する DNOA ライブラリを使用します。何が起こるかを見てみましょう Twitter 経由での認証に、ユーザーを選択した場合。

最初のステップとして、既定の Twitter の認証ページをユーザーに表示されます。ページにはタスクを行っている Twitter のアプリケーションの名前が含まれています — それに示すサンプルでは tFun の図 2。Twitter のアプリケーションを構成するときは、また、ユーザーをログイン時にアプリケーションに付与する必要があるアクセス許可を示します。ソーシャル アプリケーションを正しく構成することによって ASP.NET Web サイトを新しいユーザーに従うか、接続されているユーザーに代わってポストにアクセス許可与えることができます。これは、サンプル アプリケーションの場合ではないです。


図 2 Twitter 経由での認証

ユーザー Twitter (または好みの社会的ネットワーク) を認識する資格情報として有効である場合は、Twitter のサイト戻って指定された戻り先 URL にリダイレクトします。過去の認証制御を取り戻すため、次のメソッドは、ExternalLoginCallback です。あなたがこの時点で知っている Twitter のユーザーとしてアプリケーションへのアクセスしようとしているユーザーが正常に認識されていることは。彼女も彼女のユーザー名について何も知らない。私はほとんど、認証されたユーザーが必要しすることができます幸せのユーザー名を無視または電子メール アドレスのアプリケーションを考えることができます。認証ステップから、アプリケーションがコードを受け取るだけプログラムを使用して、Twitter の API にアクセスするにはまだ承認されていません。これを実現するには、この段階で受け取ったコード アクセス トークン (通常の時間の誤用を防ぐために制限) 交換されなければなりません。これは、メソッドの呼び出しを ExternalLoginCallback の体を見つける VerifyAuthentication の目的です。VerifyAuthentication から戻る AuthenticationResult オブジェクトは、バック、ユーザーに関する一部の情報をもたらします。あなたが得る実際の情報はプロバイダーによって異なる場合があります。 しかし、それ通常少なくとも含んでユーザー名をいます。

会員からへの認証

ユーザーを認証する最初のステップです。次に、名前がサイト内でユーザーを追跡する必要があります。古典的な ASP.NET メンバーシップ システムで認証情報の検証最初ログイン フォームを表示、[ユーザー名と、必要に応じて、その他重要な情報と認証 cookie を作成します。Twitter や Facebook 保存、ログイン フォームを配置して、資格情報の検証の負担に加えて保存およびアカウント パスワードなどの機密情報を管理する重要な負担します。

ボトムラインは、必要があるほぼすべてのアプリケーションのユーザーも必要メンバーシップ システム認証こと各正規ユーザーを名前で追跡です。このようなシステムの構築は、まだあなたの責任です。ASP.NET MVC 4 テンプレートの救助には余分なステップを提供することで来る、そのローカルのメンバーシップ テーブルに保存されます彼女の表示名を入力する機会、ユーザーが自動的に与えられます。これは、初めてユーザーが特定のサイトにログインするときにのみ必要です。表示フォーム他の言葉では、 図 3参加登録と最初のログインの目的を提供しています。


図 3 最初のログインと登録サイトを完了

この段階で入力した名前は、間違いなく円を閉じ、ASP.NET の認証 cookie を作成するのに使用されます。彼女の表示名を入力するユーザーを求めた Twitter 資格情報を確認するために使用、標準の認証 cookie を作成しました。今すぐ上から、すべてはいつものように認証対象のサイトを ASP.NET で動作します。

既定の ASP.NET MVC 4 プロジェクト テンプレートは、App_Data フォルダーの下に作成 .mdf ファイルのローカルのデータベースにユーザー データを保存します。テーブルは、Web ページのフレームワークから継承した簡単なメンバーシップ API を使用して管理されます。

次のコード サンプル プロジェクト テンプレートのページの表示名を取得する方法を示しています図 3:

var loginData = OAuthWebSecurity.SerializeProviderUserId(
  result.Provider, result.ProviderUserId);
var name = OAuthWebSecurity
  .GetOAuthClientData(result.Provider)
  .DisplayName;
  return View("ExternalLoginConfirmation",
  new RegisterExternalLoginModel {
    UserName = result.UserName,
    ExternalLoginData = loginData
  });

GetOAuthClientData への呼び出しは、Twitter のプロバイダーを共有ログインしているユーザーについての情報をアクセスです。ExternalLoginConfirmation メソッドで次コードごとに集計キーの 2 つが行われます。

OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);
OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

最初の行は、アプリケーションのメンバーシップ ローカル データベースに新しいレコードを設定します。2 番目の行は、実際に認証 cookie を作成します。既定のテンプレートを提供しますユーザー別の設定や webPages_OAuth などのデータベース テーブルの束のため­会員。後者のテーブルに、プロバイダーの名前のレコードが格納されます (つまり、トゥウィッター) は、自分のユーザ名をユーザーとユーザー別の設定テーブルでユーザーが表示を一意に識別、内部 ID へのポインターをプロバイダーの一意の ID で表示されるページで選んだ図 3

最後の考慮事項

OAuth プロトコルは、プロバイダーとクライアント アプリケーション間の相互作用を管理します。さえずり、Facebook と少数の他の人気のあるソーシャル ネットワーク、oauth Api を公開します。クライアント アプリケーションは 2 つの主な目的のため、Twitter の API 使用できます。普通のユーザー認証と、プロバイダーに対して同意ユーザーに代わって動作します。両方のケースで、クライアント アプリケーションはプロバイダーへのログインし、アクセス トークンを取得する必要があります。アクセス トークンの時間が限られている (ただし、プログラムで更新することができます)、彼女は資格情報を入力するときに、エンドユーザー承認操作のみを実行する承認されています (を参照してください図 2)。アプリケーションにアクセス トークンを保持するいると何が起こるか、アプリケーションのニーズによって異なります。トークンと言う、電子メール アドレスを取得し、アプリケーション固有のメンバーシップ システムで格納を使用できます。トークンは、ユーザーに代わってポストをも使用できます。でも Twitter からユーザーを切断すると、ASP.NET の認証 cookie は有効です。ユーザーが Twitter から切断された場合、アプリケーションはただし、投稿できません。

ASP.NET MVC API — 具体的には、OAuthWeb­セキュリティ クラス — 認証シナリオをきれいに、アドレスが、それを超えて表示名を取得するプロバイダーとの社会的相互作用をカバーしていません。Twitter や Facebook ユーザー名ローカルを格納するための簡単な会員プロバイダーの Web ページにも統合されています。

Dino Esposito*「設計モバイル ソリューションは、企業」(マイクロソフト プレス、2012) の著者である、"プログラミング ASP.NET MVC 3"(マイクロソフト プレス、2011年) との共著者"Microsoft .NET:Architecting Applications for the Enterprise』(Microsoft Press、2008 年) の共著者でもあります。Esposito はイタリアに在住し、世界各国で開催される業界のイベントで頻繁に講演しています。Twitter ( twitter.com/despos、英語) で彼をフォローしてください。*

この記事のレビュー、次技術専門家のおかげで:マニ サブラマニアン (マイクロソフト)
マニ サブラマニアン開発に関与している、ソフトウェア プロジェクトは、過去 12 年間 SOA 焦点をテスト、クラウド コンピューティングやコア。net します。