0

Azure で mvc 4 Web API プロジェクトを構築しています。この API へのリクエストは、次のルートを通過します。

      routes.MapHttpRoute(
            name: "DefaultApi", // Route name
            routeTemplate: "api/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional }
      );

同じドメインと別のルートで、mvc Web サイトをセットアップしました。

      routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

mvc Web サイトは、Access Control Services とやり取りしてトークンを取得する HTML と Javascript のページにすぎません。トークンをサービスに渡して、jQuery ajax 経由でデータを取得します。

サービスのセキュリティを実装する (API に送信されたトークンを検証する) ために、この記事で説明されているように SWTModule クラスと TokenValidator クラスを使用し、MVC 4 Web アプリケーション プロジェクトの Web.Config system.webserver 属性を呼び出します。

<modules runAllManagedModulesForAllRequests="true">
  <add name="SWTModule" type="SecurityModule.SWTModule, SecurityModule" />
</modules>

[Authorize] で MVC コントローラー メソッドをマークしていませんが、既定の Web ページを読み込むと、次のエラーが発生します。

「/」アプリケーションでサーバー エラーが発生しました。

無許可

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ApplicationException: 無許可

ソース エラー:

43 行目: 44 行目: // 'WRAP' で始まることを確認します 45 行目: if (!headerValue.StartsWith("WRAP ")) 46 行目:
{ 47 行目: new ApplicationException("unauthorized") をスローします。

ソース ファイル: D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs 行: 45

スタックトレース:

[ApplicationException: 無許可]
D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs:45 System.Web.SyncEventExecutionStep.System.Web の SecurityModule.SWTModule.context_BeginRequest(オブジェクト送信者、EventArgs e)。 HttpApplication.IExecutionStep.Execute() +80 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270

コントローラー メソッドに [Authorize] を付けていなくても、SWT トークンの検証がすべての応答に対して実行されているため、おそらく Web スタックで以前に呼び出されたため、それらが拒否されているように思えます。 Web.Config 属性?

誰かがこれを機能させる方法について正しい方向に向けることができますか? デフォルトの Web ページ (Home controller Index メソッド) にログイン画面が表示され、メイン ページにリダイレクトされるようにしたいと考えています。ユーザーが使用可能な ACS ID プロバイダーのいずれかを使用してログインしていない場合、そのメイン ページは無許可で返されます。同様に、Web API の ApiController メソッドの一部を公開したままにし、他のメソッドには承認を要求したいと考えています。

現在、MVC アプリと Web API サービスの両方を、Visual Studio の単一の Web ロール ソリューション内の単一の Web アプリケーション プロジェクト内の単一の Global.asax ファイルを介してルーティングしています。これを修正する方法は、HTML MVC サイトと Web API を、同じ Web ロール ソリューションの下で別の Web アプリケーション プロジェクトに分離することでしょうか? それでも、一部のコントローラー メソッドに承認要件を割り当てる手段は得られません。コントローラーと ApiController をルーティングするための別の場所が得られるだけです。

近くにいるような気がしますが、何か大きなものを見落としているかもしれませんが、オンラインで見つけられないようです. 誰かが私をまっすぐにしてくれますか?

ありがとう、アレックス

4

2 に答える 2

1

あなたの投稿にはいくつかの質問があるので、あなたが何を期待しているのか正確にはわかりません. これが主なもののように見えるので、モジュールが機能しない理由についてのあなたの質問に答えるだけです。

はい、SWTModule は、MVC ルートにアクセスするときに失敗する理由を説明するすべての呼び出しをインターセプトします。モジュールは Authorize 属性について何も知りません。機能させたい場合は、Aliostad のアドバイスに従い、DelegatingHandler を使用することをお勧めします。今のところ「単純に」機能させたい場合は、モジュール内のリクエストの実行パスをチェックして、API のパスのみをチェックすることができます (モジュールは公開 API メソッドではないため、これはパブリック API メソッドでは機能しないことに注意してください)。属性に注意)

はい、モジュールが追加されたプロジェクトにのみ適用されるため、2 つの別々のプロジェクトを使用することもできます。

繰り返しますが、これらはそれを機能させるための簡単な方法であり、これが ACS を使用する POC である場合には問題ありません。それ以外の場合は、さらに宿題をする必要があります。Dominick は、この件に関して非常に優れた記事をいくつか書いています。記事「ASP.NET WebAPI セキュリティ #1 ~ #4」をご覧ください。

于 2012-06-02T14:29:39.553 に答える
0

まず、承認メカニズムが例外をスローしているように見えます。通常、ステータス 403 "Forbidden" のリクエストを返します。

Web API でこれを行う正しい方法はDelegatingHandler、モジュールではなく作成することです。

Dominick Baier のThinkTectureをご覧ください。

またハレンチプラグ

于 2012-06-02T10:47:00.790 に答える