を理解されるであろう。これはさまざまな方法で実装できます。たとえば、特定の役割に基づいて拒否することはできますが、アプリのさまざまな部分のユーザーを拒否したい場合は時間の経過とともに維持することが難しい場合があります。必要なときには異なる役割を作成してコードを変更する必要がありますそれをする。例えば
:拒否として
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]に置き換えることができます。これは同じ方法で動作します(またはグローバルフィルタとして使用する)が、コントローラ/アクションへのユーザアクセスを拒否することができる役割を追加するだけです。
セキュリティは容易ではありません。セキュリティを念頭に置いて構築し、何千ものアクションを作成した場合、どのようなソリューションを使用していても、あなたは多くの作業を先取りしています。すぐに何かをあまりにも多くの仕事として却下すると、十分なセキュリティが得られません。 –
@ErikFunkenbusch現在のところ、Authorizeを使用する必要がある場所ではセキュリティが確保されていますが、これにより、1人のユーザーまたは役割を私が収集できるものからブロックすることはできません。しかし、解決策があれば私は認可に実装することができますが、私はそれを打つことを喜んでより多くなります! – jjr2000
AuthorizeAttributeには「拒否」機能はなく、許可のみがあります。標準認可を使用する場合は、ロールをよりきめ細かく設定し、ユーザーがアクセスできるロールのみを割り当てる必要があります。一般的に、特に、何千ものアクションと多数のユーザーがいる場合、ユーザーの行動を許可または拒否することは維持できません。それ以外の場合は、何らかのデータ駆動型アクセスを構築する必要がありますが、これは簡単なことではありません。また、あなたが使っているmvcの正確なバージョンと、あなたが使っている正確な認証/認証の形式に依存します。 –