2009-09-24 4 views
5

私はASP.NET MVCコントローラ上でカスタム認可フィルタを使用しています。この認可フィルタは、ログイン画面以外のURLにユーザをリダイレクトします。ViewResult以外の結果を返すアクションに対する承認をどのように扱いますか?

これは、ビューを返すアクションでは問題ありませんが、多くのアクションがPartialResultやJsonResultなどの他の結果タイプを返します。

私の現在のフィルタは次のようになります。

< AuthorizeWithRedirect(役割:= "ServerAccess"、コントローラー:= "ホーム"、アクション:= "無断")>

これが示しますユーザーがServerAccessの役割にない場合は、/ Home/Unauthorizedにリダイレクトする必要があります。

他の人々がこれをどのように処理しているのか不思議です。これは、クライアントサイドのスクリプトAJAX呼び出しによってのみ呼び出されることが意図されているアクションの数を考慮する場合、特に問題があるようです。/home/Unauthorized/actionは、呼び出し元がビュー、部分ビュー、json、コンテンツなどを受け取るように意図されているかどうかをどのように知ることができますか?

答えて

1

リダイレクトでその情報を渡す必要があると思います。

カップルの方法は、これを扱うことができます:

  • はあなたが必要とする応答の種類ごとに別々のアクションメソッドを作る考えてみましょう - UnauthorizedJson、オリジナルのアクション応答タイプに対応したUnauthorizedHtml、UnauthorizedEtc ...

  • あなたのフィルタで許可されていないメソッドに別のパラメータを追加し、URLにそれを追加することで、リダイレクションと書式情報を渡す

+0

最初のオプションは、ActionResultの各タイプ(UnauthorisedPartial、UnauthorisedJSON)に対するコントローラアクションを使用して、現在取っているルートです。それは私が1つの標準的なページを書いて、どの発信者にも返すことを可能にする。 – Nick

9

使用Request.IsAjaxRequest()、例えば:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public AjaxAuthorizeAttribute() : base() 
    { 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Extends the original Web.MVC.AuthorizeAttribute for Ajax calls. 
     // Basically if the request is not authorized and the request is an AJAX Request. 
     // then we simply set the stats Code to 403 and set an empty Result, in order to 
     // determine in Javascript if the AJAX call came back completed and valid. 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result == null) 
     { 
      return; 
     } 
     else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
       && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new ContentResult(); 
      filterContext.HttpContext.Response.StatusCode = 403; 
     } 
    } 
} 

注403、401ではない、ASP.NETは401Sをインターセプトし、HTMLのエラーページにそれらを回すことから。 AJAXの呼びかけが何を受け取るかは関係ありません。ステータスコードが引き続き表示されます。

+0

403を返すことは、私が考慮しなかった興味深いアプローチです。私はこれがクライアントスクリプトにonusを入れて、ユーザーに適切なメッセージを生成すると思います。 – Nick

+0

どのようにあなたがそれを行うに関係なく、onusは常にAJAXに存在します。 –

関連する問題