2013-08-05 10 views
8

コントローラの上部にあるMVCで、[Authorize()]属性を使用して、コントローラ全体へのアクセスを認証された特定のユーザーやロールに制限できますが、IPではなく、コントローラーインスタンスごとに制限する必要があります。 MVC Area全体へのアクセスを認証されたUser/Roleまたは要求元IPに制限する方法はありますか?IP /ロール/ユーザー別にMVCエリア全体を保護する方法は?

+0

検索**カスタム認可属性** – Dmitry

+0

私自身の属性を作成するつもりはありません。ビルドされた役割/ユーザー権限コントロールを使用し、それらをエリアレベルで適用したいだけです。エリアレベルでIPのコードチェックをいくつか適用するといいかもしれませんが、.csファイルを作成して各コントローラのアクションから呼び出すことができますが、ちょっと面倒です。 –

+1

"ロール/ユーザー権限の管理"には何を考慮していますか?私は '[Authorize]'属性を考えることはできません。あなたはあなたのエリアのベースコントローラを持つことができ、そのエリアのすべてのコントローラをそのベースコントローラから派生させ、ベースコントローラのカスタム権限属性を叩くことができます。それは全体の領域認可の世話をするだろうし、IPで制限するためにそれをカスタマイズすることができた – Dmitry

答えて

15

お住まいの地域でベースコントローラを作成します。

[AuthorizeArea(AllowIpAddresses = new [] {"1.1.1.1", "1.2.3.4"})] 
public class CustomAreaBaseController : Controller 
{ 
    public CustomAreaBaseController() 
    { 
     // possibly any other common code that you want to run for all controllers in this area 
    } 
} 

は、お住まいの地域のすべてのコントローラがベースコントローラから派生しておいてください。

public class HomeController : CustomAreaBaseController 
{ 
    // actions for this controller 
} 

は属性を許可するカスタム作成のための:

public class AuthorizeArea : AuthorizeAttribute 
{ 
    public string[] AllowIpAddresses { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     bool isValid = false; 

     if (httpContext == null) 
            throw new ArgumentNullException("httpContext"); 

     // get current ip address 
     var ipAddress = httpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
     if (string.IsNullOrEmpty(ipAddress)) 
      ipAddress = httpContext.Request.ServerVariables["remote_host"]; 

     if (AllowIpAddresses.Contains(ipAddress)) isValid = true; 

     return base.AuthorizeCore(httpContext) && isValid; 
    } 
} 
+0

私はこのアプローチが好きです。脇に、IPアドレスがデータベースに格納されている場合はどうしますか? – harriyott

+0

このメソッドの中のdbからそれらを取得し、それらをキャッシュしなければならないでしょう。 – Dmitry

関連する問題