2016-11-19 13 views
1

主な目標:Webサイト(ASP.NET MVC 5)を作成して、認可リダイレクションロジックを追加する必要があるたとえば、ユーザーはページAとページBを完了した後でしかページCを見ることができません。ページAを完了してBを完了してページCにアクセスしようとすると、ページBにリダイレクトされます。ASP.NET MVC5 - オーバーライドOnAuthorization() - 保護レベルのため、 'MvcResources'にアクセスできない

研究の量、私の計画はカスタムAuthorizationAttributeを作成し、OnAuthorization()をオーバーライドすることです。私はこれを責任感を持って行いたいので、この方法の[ソースコード] [1]を見て、それを取り除くのではなくロジックを追加したいだけです。

  • MvcResources:

    問題は二つの要素がここで私は明らかにアクセスできないことがあります:私は私自身のサブクラス(私はこの記事の末尾に含まれている)を介してそのコードをコピーして始めました.AuthorizeAttribute_CannotUseWithinChildActionCache

  • CacheValidateHandler

最初はSystem.Web.Mvc.Propertiesであり、そして私が手にエラーが「MvcResourcesは、その保護レベルにアクセスできない」ということです。これに関してオンラインで見たすべての助けは、プログラマがクラスのアクセス修飾子を変更するとアドバイスしますが、私はこのクラスを書いていないのでできません。それはシステムコードです。

2番目(CacheValidateHandler) 'は現在のコンテキストに存在しません'。私の親クラス(AuthorizeAttribute)のメソッドですが、それはプライベートクラスです。

私は行方不明のものがありますか?私のサブクラスは特別な場所になければなりません(今はHelpersというフォルダにあります)、あるいは名前空間とは何か別のことをしなければなりませんか?私はまだC#で​​かなり新しいです。親メソッドの処理を繰り返すことができない場合でも、OnAuthorizeを安全にオーバーライドするにはどうすればよいですか?

namespace MyApp.Helpers 
{ 
    public class MyAppAuth : AuthorizeAttribute 
    { 
     public virtual void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (filterContext == null) 
      { 
       throw new ArgumentNullException("filterContext"); 
      } 

      if (OutputCacheAttribute.IsChildActionCacheActive(filterContext)) 
      { 
       // If a child action cache block is active, we need to fail immediately, even if authorization 
       // would have succeeded. The reason is that there's no way to hook a callback to rerun 
       // authorization before the fragment is served from the cache, so we can't guarantee that this 
       // filter will be re-run on subsequent requests. 
       throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache); 
      } 

      bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) 
           || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true); 

      if (skipAuthorization) 
      { 
       return; 
      } 

      if (AuthorizeCore(filterContext.HttpContext)) 
      { 
       // ** IMPORTANT ** 
       // Since we're performing authorization at the action level, the authorization code runs 
       // after the output caching module. In the worst case this could allow an authorized user 
       // to cause the page to be cached, then an unauthorized user would later be served the 
       // cached page. We work around this by telling proxies not to cache the sensitive page, 
       // then we hook our custom authorization code into the caching mechanism so that we have 
       // the final say on whether a page should be served from the cache. 

       HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache; 
       cachePolicy.SetProxyMaxAge(new TimeSpan(0)); 
       cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */); 
      } 
      else 
      { 
       HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    } 
} 

答えて

1

私は解決策を持っていると信じていますが、私がやっていることは安全ではないどのような方法であればより多くの経験を持つ誰かがコメントすることができれば、私は本当に大好きです。

最初の問題では、MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCacheを文字列に置き換えました。これはInvalidOperationExceptionのオーバーロードの可能性があるためです。

private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) 
{ 
    validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); 
} 
+0

I第1、第2の文:第二の問題については

は、私が親のプライベートCacheValidateHandler()メソッドをコピー、貼り付けました。 – Sinjai

関連する問題