2016-11-24 5 views
0

ASP.NET MVC 5では、[Authorize]属性を使用して承認をチェックし、一部のアクションページへのアクセスを制限することができます。 この属性を変更するにはどうすればいいでしょうか?一定期間後に認証を確認する必要がありますか? たとえば、許可されていないユーザーにを表示させ、10分間の間ページを表示してからアクセスをブロックします。ASP.NET MVC 5のカスタム認可フィルタ?

更新日:私の質問がはっきりしていないと思われるので、私はその問題を大胆にしました。権限のないユーザーがサイトに費やした時間をカウントし、N分後にブロックする必要があります。

+0

実際には、[AllowAnonymous]が本当に欲しいですが、1回の訪問では限られた時間だけ、サイト全体が対象となります。 –

答えて

0

これは何か?独自の属性を作成し、独自のコードでデフォルトを上書きします。

public class CustomAuthAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     //your code here 
    } 
} 

その後は[CustomAuthAttribute]

以下
1

であなたのコントローラ/アクションを飾る私はどこで、なぜAuthorizeAttribute

ご予約の流れ認可を使用してアクションへのアクセスを制限するために、いくつかの例を列挙されています。

Example : 

    // Restrict unauthorized access:  
    [Authorize] 
    public ActionResult YourActionView() 
    { 
     return View(); 
    } 


    // Restrict by user:  
    [Authorize(Users = "prashant,lua")] 
     public ActionResult YourActionView() 
     { 
      return View(); 
     } 

    // Restrict by role: 
    [Authorize(Roles="Administrators")] 
    public ActionResult YourActionView() 
     { 
      return View(); 
     } 

2.コントローラーへのアクセス許可を確認してください。

// Restrict unauthorized access:  
    [Authorize] 
    public class ValuesController : ApiController 
    { 
    } 

    // Restrict by user: 
    [Authorize(Users="Prashant,Lua")] 
    public class ValuesController : ApiController 
    { 
    } 

    // Restrict by role: 
    [Authorize(Roles="Administrators")] 
    public class ValuesController : ApiController 
    { 
    } 
0

Authorize属性は承認プロセスを容易にするように設計されていると思います。匿名ユーザーがサイトを表示してしばらくしてからアクセスをブロックできるようにするには、クライアント側のスクリプトを検討してください。 、そして、

public class AuthorizeAttributeWithAnonTimeoutAttribute : AuthorizeAttribute 
{ 
    public int? AnonymousMinutesTimeout { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Let default handling occurs 
     base.OnAuthorization(filterContext); 

     // If result is set, authorization has already been denied, 
     // nothing more to do. 
     if (filterContext.Result as HttpUnauthorizedResult != null) 
      return; 

     var isAnonAllowed = filterContext.ActionDescriptor.IsDefined(
       typeof(AllowAnonymousAttribute), true) || 
      filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
       typeof(AllowAnonymousAttribute), true); 
     if (isAnonAllowed && AnonymousMinutesTimeout.HasValue && 
      // Not authorized 
      !AuthorizeCore(filterContext.HttpContext)) 
     { 
      const string visitStartCookieName = "visitStartCookie"; 
      const string visitStartDateFormat = "yyyyMMddhhmmss"; 
      var visitStartCookie = filterContext.HttpContext.Request 
       .Cookies[visitStartCookieName]; 
      var now = DateTime.UtcNow; 
      DateTime visitStartDate; 
      var visitStartCookieValid = visitStartCookie != null && 
       DateTime.TryParseExact(visitStartCookie.Value, 
        visitStartDateFormat, null, DateTimeStyles.AssumeUniversal, 
        out visitStartDate); 
      if (!visitStartCookieValid) 
      { 
       visitStartDate = now; 
       filterContext.HttpContext.Response.Cookies.Add(
        // Session cookie. 
        new HttpCookie 
        { 
         Name = "visitStartCookie", 
         Value = now.ToString(visitStartDateFormat) 
        }); 
      } 
      if (visitStartDate.AddMinutes(AnonymousMinutesTimeout.Value) < now) 
      { 
       // Anonymous visit timed out 
       HandleUnauthorizedRequest(filterContext); 
       return; 
      } 
     } 
    } 
} 

それはあなたに合った場合は、グローバルフィルタとして使用する、このような:

2

あなたは、このような限られた時間の間、匿名ブラウジングを可能にするためのカスタム認証を実装すること

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(
     new AuthorizeAttributeWithAnonTimeoutAttribute 
     { 
      // By example, 10 minutes 
      AnonymousMinutesTimeout = 10 
     }); 
    // Your other filters 
    ... 
} 

そしてAllowAnonymousAttributeであなたのコントローラやアクションを飾ることを忘れないでください:

[AllowAnonymous] 
public class YourController 
{ 
} 

それとも

public class YourController 
{ 
    [AllowAnonymous] 
    public ActionResult YourAction() 
    { 
    } 
} 

あなたはまた、定義した場合、カスタムのコントローラやアクションに直接属性を承認置いてもよいことは、世界的にあなたに合っていません:

// By example, 10 minutes anonymous browsing allowed. 
[AuthorizeAttributeWithAnonTimeout(AnonymousMinutesTimeout = 10)] 
public class YourController 
{ 
} 

この実装は匿名のタイムアウトを確保しませんのでご注意ください。ハッカーは、彼が望む限り、それを克服し、匿名で閲覧することができる。ブラウザツールではCookieの削除が可能なので、新しいタイムアウトで簡単に開始できます。

匿名のタイムアウトを確保することは非常に困難です。これは、ユーザーが匿名であるためです。あなたは匿名ユーザーを特定し、タイムアウトサーバー側を追跡しようとする可能性があります。
しかし、あなたはおそらく多くの問題に直面するでしょう:同じIPアドレスでブラウズしたり、単一のインターネット接続を持たないため異なるIP間を切り替える企業ユーザー...