2017-05-16 2 views
0

ロールは、アクセスが許可されていないユーザーとサイト全体を指定できます。ユーザーはそうです。指定された例外とは別に、すべてのコントローラ/アクションへの役割/ユーザーアクセスを拒否する方法asp.net MVC

私は、拒否されたユーザーがこの選択されたアクションとコントローラーに可能な限りアクセスできるように、選択されたアクションのauthorizeヘッダーの行に沿って何かを行うことができます。

私はロールを作成してこのロールに他のすべてのユーザーを追加し、このロールで承認属性を実行することができますが、これはプロジェクトが既に存在するため、何千もの行動ではなく何千もの行動で構築されている。

だから、任意の提案は、ここでは最も簡単な解決策は、おそらく承認が拒否機能を追加するカスタム属性だろう

+0

セキュリティは容易ではありません。セキュリティを念頭に置いて構築し、何千ものアクションを作成した場合、どのようなソリューションを使用していても、あなたは多くの作業を先取りしています。すぐに何かをあまりにも多くの仕事として却下すると、十分なセキュリティが得られません。 –

+0

@ErikFunkenbusch現在のところ、Authorizeを使用する必要がある場所ではセキュリティが確保されていますが、これにより、1人のユーザーまたは役割を私が収集できるものからブロックすることはできません。しかし、解決策があれば私は認可に実装することができますが、私はそれを打つことを喜んでより多くなります! – jjr2000

+0

AuthorizeAttributeには「拒否」機能はなく、許可のみがあります。標準認可を使用する場合は、ロールをよりきめ細かく設定し、ユーザーがアクセスできるロールのみを割り当てる必要があります。一般的に、特に、何千ものアクションと多数のユーザーがいる場合、ユーザーの行動を許可または拒否することは維持できません。それ以外の場合は、何らかのデータ駆動型アクセスを構築する必要がありますが、これは簡単なことではありません。また、あなたが使っているmvcの正確なバージョンと、あなたが使っている正確な認証/認証の形式に依存します。 –

答えて

1

を理解されるであろう。これはさまざまな方法で実装できます。たとえば、特定の役割に基づいて拒否することはできますが、アプリのさまざまな部分のユーザーを拒否したい場合は時間の経過とともに維持することが難しい場合があります。必要なときには異なる役割を作成してコードを変更する必要がありますそれをする。例えば

:拒否として

public class DenyAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return !base.AuthorizeCore(httpContext); 
    } 
} 

これはAuthorizeAttributeの役割プロパティを使用します。

[Deny(Roles="DeniedUsers")] 

それ以外の場合は、誰もが役割にアクセスすることが指定されていない可能になり、ブロック全体的に認証されていないユーザーようなコントローラまたはグローバルフィルタレベルでのように、あなたがより高いレベルの認証のいくつかの種類が必要になること、しかし注意してください認証されていないユーザーを含む。そのため、おそらくのようなものを追加します。

return httpContext.User.IsAuthenticated && !base.AuthorizeCore(httpContext); 

[AllowAnonymous]と一緒にこれを使用することが問題となる可能性があることに注意してください。

もう1つの選択肢は、現在のコントローラ/アクションに基づいて拒否を計算する、より柔軟なシステムを作成することです。このような何か:

public class DenyByControllerActionAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var controller = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller"); 
     var action = httpContext.Request.RequestContext.RouteData.GetRequiredString("action"); 
     var denyRole = string.Format("Deny{0}:{1}", controller, action); 
     return !httpContext.User.IsInRole(denyRole) && base.AuthorizeCore(httpContext); 
    } 
} 

あなたはフォーマットの役割にユーザーを追加することによって、アクセスを制御することができます「拒否{コントローラ}:{アクション}」、DenyHomeのようなので、何か:インデックスまたは「DenyAdmin:電子メール」 。

これには、ベースのAuthorizeCore機能を呼び出すことによって、デフォルトの権限アクセスも必要です。したがって、[Authorize]を `[DenyByControllerAction]に置き換えることができます。これは同じ方法で動作します(またはグローバルフィルタとして使用する)が、コントローラ/アクションへのユーザアクセスを拒否することができる役割を追加するだけです。

+0

私の目的のために拒否する人は、助けてくれてありがとう! – jjr2000

+0

@ jjr2000 - 私が言及した警告を念頭に置いてください。あなたの環境でセキュリティを確保するためには、広範なテストを行う必要があります。 –

関連する問題