2011-01-13 10 views
4

私のコントローラでは、for edit userと表示されます。私のコントローラーでは、ユーザーが編集権限を持っているかどうかを確認して、ある種の認証やエラーを禁止してエラーページを表示したいと思います。コントローラからのASP.NET MVCスローとハンドルエラー

コントローラーとエラーだけのアクションを作成するのではなく、これを行う方法はありますか?これを行う正しい方法は何ですか?

答えて

2

は、カスタムAUTHORIZEの例だあなたが使用できる属性:その後、

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // if the user is not authenticated render the AccessDenied view 
      filterContext.Result = new ViewResult { ViewName = "AccessDenied" }; 
     } 
    } 
} 

と、この属性を使用してコントローラのアクションを飾る:

[CustomAuthorizeAttribute] 
public ActionResult SomeAction() 
{ 
    ... 
} 

あなたが知っておく必要があり、このアプローチには注意点が1つありますの。ユーザーが承認されていない場合、サーバーは非常にSEOに優しい200のステータスコードを送信します。 401ステータスコードを送る方が良いでしょう。問題は、フォーム認証を使用している場合、カスタムモジュールがASP.NET実行パイプラインに追加され、サーバーが401ステータスコードを送信するたびにインターセプトされ、自動的にログインページにリダイレクトされることです。この機能は仕様によるもので、ASP.NET MVCのバグではありません。いつもそうだった。

そして、実際のところ、この不快事態回避する方法があります:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // if the user is not authenticated render the AccessDenied view 
      filterContext.HttpContext.Items["unauthorized"] = true; 
     } 
    } 
} 

をし、Global.asaxの中:

あなたがそうのようなカスタム認証フィルタを変更することができ

protected void Application_EndRequest() 
{ 
    if (Context.Items.Contains("unauthorized")) 
    { 
     Context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
     Context.Server.Transfer("~/401.htm"); 
    } 
} 

これで改善しました。カスタムエラーページで401ステータスコードが得られます。ニース。

-1

あなたの認可は、ユーザーごとに基づいているので、あなたが提供Authorizeフィルタを使用することはできません(私は正しいプロセスが各ユーザーのみが自分のデータを編集することができであると仮定)。

代わりにcustom authorization filterを書きます。あなたはどんな機能を提供してもかまいません。通常は、401 HTTPステータスコードを返すことです。ここで

+0

Downvote?どうして?他の答えははるかに完全ですが、同じことを提供します。カスタム認証フィルタ。私の答えを関連性のあるものにすることができるように、あなたのdownvoteを詳述してください。 –

関連する問題