2012-03-06 12 views
38

は、私は、コントローラ上の許可属性を持っていますが、私は1つのアクションでそれをオフにしたいと思います。 自分の認証フィルターを作成し、役割リストに「匿名」を追加しました。私のフィルタでは、匿名がロールリストに表示される場合はtrueを返します。MVCコントローラの1つのアクションで許可を無効にすることはできますか?

しかし、コントローラ許可が何かを横取りされたかのようにログインページを乗り越えるように思えません。

+0

'(1):'わかりません、いくつかのコードは良いでしょう。 '(2):'アクションメソッドに認可属性を追加することができます。 – gideon

+0

独自のバージョンの属性を作成できます。 http://stackoverflow.com/questions/746998/override-authorize-attribute-in-asp-net-mvc – Tx3

+0

皆さん、みなさんはあなたを理解していないようです:)。私は理解していますが、同じ問題があるので解決策が必要でした。その間に何かを見つけましたか? –

答えて

69

あなたは、コントローラクラスに[Authorize]を追加し、あなたが許可されないようにする単一のアクションに[AllowAnonymous]を追加することができます。例:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult Profile() 
    { 
     return View(); 
    } 

    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     return View(); 
    } 
} 
+1

これはMVC4以上でのみ動作しますが、完全に動作します – Nathan

-3

により、たとえば必要はありません今までに、アクションメソッドにAuthorizationAttributeを追加しないでください。

マイカスタム属性

public class AuthorizationFilterAttribute : AuthorizeAttribute 
{ 
     Some code... 
} 

私のコントローラ

public class UserController : BaseController, IDisposable 
{ 
     [AuthorizationFilterAttribute] 
     public ActionResult UserList() 
     { 
      //Authorize attribute will call when this action is executed 
     } 

     public ActionResult AddUser() 
     { 
      //Authorize attribute will not call when this action is executed 
     } 

} 

私はあなたが私はあなたを言うしようとしています何私のポイントを得たいと考えています。

=================更新回答========================== ===================== 以下のような1つの以上の属性を作成します。

public sealed class AnonymousAttribute : Attribute { } 

下記のコードをOnAuthorizationメソッドに入力してください。

public override void OnAuthorization(AuthorizationContext filterContext) { 
      bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
+0

これは、コントローラのアクション全体にフィルタを追加することを意味します。私は、認可フィルタを一番上にして、私が必要とする場所を無効にするという考えが好きです。このようにしてより強固で安全です。 – jaffa

+0

そうですね。私にそれを知らせてください、それはあなたのために働くのですか?それが答えである場合にはそれを他人にとって有益なものにしてください。 –

+0

これは、あなたが望む唯一のアクションで認可を得るために働いていますが、それはOPの質問ではありませんでした。 – Kyle

3

独自のバージョンの属性を作成できます。

このような状況を処理する独自の属性を実装する方法は非常によく似ています。

Override Authorize Attribute in ASP.NET MVC

Btw。デフォルトで許可を持つコントローラを作成することもできます。

ベース

[Authorize] 
public abstract class SecureControllerBase : Controller 
{ 
} 

使用

public class MyController : SecureControllerBase 
{ 
} 
+0

ありがとう、しかし、私はコントローラが10のアクションメソッドを許可し、1つだけのアクションを必要とすると言う。私のコントローラーは、(コントローラー定義の最上部に権限フィルターを置いて)すべてのアクションで許可を有効にしていますが、1つのアクションメソッドでそれを無効にしたいだけです。 – jaffa

+0

コントローラに[OptionalAuthorize]を追加し、アクションの上に[OptionalAuthorize(false)]を追加すると、それはあなたのために働くのですか? – Tx3

0

単にコントローラクラスにあなたがフィルタリングしたいアクションに属性を追加し、ではありません。アクションを装飾しないことによって、コントローラまたはそのベースコントローラの1つが属性を持たない場合、アクションはフィルタリングされません。

+2

私はルールの例外を欲しいので、コントローラーの電源を入れ、単一のアクションをオフにします。 – jaffa

1

は、私はちょうどフェデレーションIDプロバイダーとしてAzureのACSを使用してソリューションを行なったし、受け入れられた答えは私のために動作しませんでした。苦労している人にとって、私の解決策は、必要なコントローラー/ビューのセキュリティを完全に回避することでした。

承認をバイパスする必要のあるアクションの新しいコントローラ/ビューを作成します。

とWebで

。configを次のように追加します。

<location path="TheNameOfTheControllerYouWantToBypass"> 
    <system.web> 
    <authorization> 
    <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
関連する問題