web-dev-qa-db-ja.com

AngularJS + ASP.NET Web API + ASP.NET MVC認証

AngularJSは初めてで、新しいWebアプリケーションで評価しようとしています。

要件:

私は、Android、iPhone、およびWebアプリケーション(ASP.NET MVC)からも使用されるASP.NET Web APIを1つ使用します。 ASP.NET IdentityはWeb APIに実装されます。 3つのアプリケーションすべてがWeb APIのログインメソッドを呼び出して、認証トークンを取得します。

問題:

私の問題は、ASP.NET MVCを取得する方法ですサーバー側認証動作(Web APIと同期しているため、ASP.NET MVCに個別にログインする必要はありません)Angularは、HTMLテンプレート/ビュー、JavaScriptファイル、またはその他のリソースを取得するための呼び出しを行います。AngularJSに関する多くの記事やブログを読みましたが、それでも私の要件に適合するセキュリティモデルを見つけることができません。

可能な解決策:

Web APIの代わりにASP.NET MVCアプリケーションへのログイン呼び出しを直接行うのは良い考えでしょうか。ASP.NETMVCアプリケーションはWeb APIを呼び出してログインし、認証されると、セッションで認証トークンを保存し、 FormsAuthentication cookieおよびcookieデータに暗号化された認証トークンを保存します。さらに、HTMLのどこかにng-initのauth tokenを設定して、AngularJSスコープにトークンを設定します。これで、AngularJSがASP.NET MVCアプリケーションを呼び出してHTMLを取得しようとしたときに、Cookieの非暗号化データをセッションの認証データと照合して、ユーザーを認証/承認します。また、AngularJSはWeb APIメソッドを呼び出すためのヘッダー内の認証トークンを、Web APIを介したデータ操作のための後続のすべての呼び出しに直接送信します。

19
Haider

私は非常にまっすぐな解決策で問題を解決しました。 WebApiConfigのRegisterメソッドに次の2行のコードがあることを確認しました。

config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

それでおしまい。ここで、私のMVCコントローラーは承認のためにセッションCookieを探しますが、私のWeb APIコントローラーは各リクエストのヘッダーで認証トークンを探します。さらに、Web APIは、ログイン/認証リクエストに応答して、トークン(JSON)とセッションCookie自体を送信します。 http:\\www.mydomain.com\token

そこで、トークンとセッションCookieを取得するために、ログイン要求をWeb APIに送信します。セッションCookieはリクエストごとに自動的に送信されるため、MVCコントローラーの承認について心配する必要はありません。 Web API呼び出しの場合、Web APIコントローラーは要求と共に送信されるセッションCookieを気にしないため、各要求のヘッダーで認証トークンを送信しています。

8
Haider

また一見の価値があります:

https://bitbucket.org/david.antaramian/so-21662778-spa-authentication-example/overview

this SO question に基づく)

警告:気弱な人向けではありません...

  • ASP.NET Web API 2
  • HTML5 + AngularJS + $ ngRoute
  • NuGet足場
  • ヨーマン(グラント/バウアー)
  • Owinフレームワーク(OAuth 2.0)
  • [〜#〜] cors [〜#〜]
4
Dunc

私はあなたが正しい道にいると思います。トークンをAngularサービスに保存して、自分で簡単にできるようにします( http://blog.brunoscopelliti.com/deal-with-users-authentication-in-an -angularjs-web-app )。「AngularJSがASP.NET MVCアプリケーションを呼び出してHTMLを取得しようとする」とは少し混乱していますが、MVCアプリを保護する必要はありません。 、それはあなたのAngularを実行しているだけですよね?APIも同様に保護したい部分です。

0
Steve Sloka