2011-06-25 17 views
3

コントローラから別のURLが承認されているかどうかを確認したいのですが、ASP.Net MVC:URLが承認されているかどうかの確認

したがって、たとえば、私はそうのようなコントローラを呼び出すしたいと思います:

[HttpPost] 
public ActionResult IsUrlAuthorized(string url) 
{ 
    bool isAuthorized = // What do I put here? 
    return Json(isAuthorized); 
} 

だから、私は、現在のユーザが通過を許可されているかどうかをチェックするために呼び出すことができるもの知りたいですURL内にあるかどうか。私は答えは、MVCの外に少し座って、ルートとは何かを持っていると思いますか?ユーザーは、または一般的に認可してもしなくてもよいが、特定のURLを参照して、右の権限や役割の割り当てを持っていない可能性がありますので ASP.NET MVC. Check if user is authorized from JavaScript

これはやや似質問ではなく、まったく同じものです。

アイデア?

アップデート:私は標準のMVC認証属性を使用してアプリケーションをロックするので、ここではそのようなものの例を挙げます。 MVCルートでコントローラにマップします。コントローラ上の単一のメソッドは、1つまたは複数のロールに制限することができます。

public class HomeController : Controller 
{ 
    [Authorize(Roles = "User, Moderator")] 
    public ActionResult ListRecentPosts() 
    { 
     . . . 
    } 
} 

あるいは、全体のコントローラは、1つ以上のロールに制限することができます。

[Authorize(Roles = "Admin")] 
public class AdminController : Controller 
. . . 

これらの任意の実際のURLあなたのユーザーにいいことと、より多くのルートを追加することによって、URLを推測することができ、

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

しかし - AR通り:コントローラのメソッドは、標準のMVCアプリでデフォルトのマッピングに基づいているために応答しますコントローラメソッドはそれを指す多くの名前を持つことができます。コントローラの名前をURLから推測して推測することはできません(サイトのURLの半分に対応する方法であっても)。

おそらく私は、URLが現在のユーザのために認可されているかどうかを直接ルーティングエンジンに尋ねる方法を必要とするか、コントローラと方法のどちらのルーティングエンジンに質問してから、うまくいけばReflectionとMatching Rolesを直接使用することではありません。

更新2:これは私のアプリの一番上にアカウントストリップがあります。その状態は、あなたが認可しているいくつかのアカウントの1つを選択することによって変更できます。アプリのどこにあるかによって、選択したアカウントにこのページを表示する権限が与えられていて、失うことのないフォームに記入している可能性があります。つまり、別のアカウントを選択したときにリフレッシュするという単純なアプローチは有害であり、フォームがなくてもすべてのテキストを読み込んでいるだけでユーザーの時間が無駄になります。

ユーザーは、その利便性は良いですが、ユーザーは、許可を持たないユーザーが実際には拒否されていると見なすことができないページを公平に推測しようとしています(そして、禁止されているページ - それから取られたアクションは失敗します)。だから私は彼らの新しい権限に基づいてリダイレクトするかどうかを知る必要があります。

私が大好きなものの1つは、.NETは多くの優れたライブラリが非常に優れた方法で分解するため、通常の機能や新しい紆余曲折の一部であるものを簡単に再構成できます。ルーティングモジュールとMVCの両方が非常にうまく構築されているようですので、これを行うことができると思わなければなりません。

安いハックは、ユーザーが承認されていないときに一貫性のあるリダイレクトステータスコードを返すことです。また、ユーザーがアカウントストリップで自分のアカウントを変更すると、2つのAJAX呼び出しが発生します。 AJAX上で現在のページに2番目のページを表示して、HTTPステータスコードを確認します。 200 OKはページをそのままにしておくことを意味し、リダイレクトはリダイレクトに従うことを意味します。明らかにこれはちょっと醜いことですが、余分なHTTP呼び出しが含まれ、ログに誤ったヒットが作成され、アプリケーション全体で認証がどのように処理されるかが前提となります。

ページが承認されている可能性がありますが、ページの動作や外観が変更されている可能性があります。この特定のアプリはアカウント(アカウントのストリップ自体に加えて)に基づいて外観に変化はなく、聴取するカスタムイベントを提供するだけで機能変更を処理することができます。

+0

ここで、これらの正しい権限が格納されています – Tassadaque

+0

私は現在私がどのように現在のところ権限を定義しているのかの例を与えるために質問を展開します(標準MVCのものです) –

答えて

4

あなただけのURL承認を使用している場合にのみ機能します。しかし、ルーティングを使用するMVCでは、アプリケーションを保護するためにURL認可を使用しないことを強くお勧めします。

代わりに、コントローラクラスでAuthorization属性を使用することをお勧めします。その理由は、同じコントローラアクションを呼び出す複数のURLが存在する可能性があるからです。エントリー方法だけでなくリソースのリソースを保護する方が常に良いです。

この場合、URLを指定してコントローラのインスタンスを取得する必要があります。ちょっと難しいのは、基本的にMVCパイプラインを実行して、URLを持っているポイントからコントローラがあるポイントまでMVCパイプラインを実行する必要があるからです。それは可能ですが、重量があるようです。

あなたの目標を達成するためのより良い、より簡単な方法がないのだろうかと思います。あなたは本当に何をしようとしていますか?

更新:あなたのシナリオに基づいて、これはUI目的のためだけの初期チェックであるように思えます。おそらく、URLへの非同期Ajax要求を行い、HTTPステータスコードをチェックするだけです。 401ステータスコードの場合、ユーザーは承認されていません。それは最も安全な賭けのようです。

+0

もう少し質問を展開して目標を説明します。 –

-1

UrlAuthorizationModule.CheckUrlAccessForPrincipalメソッドについてはどうでしょうか。 UrlAuthorization.CheckUrlAccessForPrincipalを使用して

UrlAuthorizationModule.CheckUrlAccessForPrincipal Method (System.Web.Security)

+0

これは決して試しませんでしたが、 ASP.NETの典型的なurl-mapped-funk-schwaではなく、ルートを計算して、どのコントローラとアクションを実行しているかを把握する必要があります。 –

+0

デフォルトのmvc3ソリューションを作成し、Home/Index.cshtml @ UrlAuthorizationModule.CheckUrlAccessForPrincipal( "〜/ Account/ChangePassword"、User、 "GET")を作成します。ええ、ごめんなさい。 – takepara

+0

UrlAuthorizationModule.CheckUrlAccessForPrincipalがチェックされていませんAuthorize属性... – takepara