2016-06-03 16 views
7

Ben eski MVC5 projesinde özel bir AuthorizeAttribute var denilen tespit edilmesi halinde açıkça başka bir yerde kodunda, üreten sahte günlükleri:AuthorizationAttribute elle

var filters = new FilterInfo(FilterProviders.Providers.GetFilters(controllerContext, actionDescriptor)); 
foreach (var authFilter in filters.AuthorizationFilters) 
{ 
    authFilter.OnAuthorization(authContext); 
    if (authContext.Result != null) {return false;} 
} 

OnAuthorization yöntemi açıkça ediliyor olmadığını calle (StackTrace ya da bir şey aracılığıyla) anlamanın bir yolu var mı d veya öznitelik denir? Şu anda sahip olduğum en iyi şey Environment.StackTrace.Contains("at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters").

+0

Neden kodunuzdaki 'AuthorizeAttribute'' OnOuthorization' yöntemine ilişkin tüm başvuruları bulamıyorsunuz? –

+0

Hangi MVC sürümünü kullanıyorsunuz? –

+0

@AmateurProgrammer Yaptım. Dislodge etmek zor. Her şeyi tekrar yapabilirsek, bunu farklı yapardık. – Arithmomaniac

cevap

1

AuthorizeAttribute tek sorumluluğu vardır. Bu, uygulamada birçok farklı nedenden dolayı birden fazla yerde kullanılabilir.

Yetkilendirilmemenin bir sonucu olarak alınan tüm eylemler (HTTP 401 yanıtı döndürme gibi), AuthorizationContext.Result özelliğine ayarlanan ActionResult türünde bir işleyiciye devredilir.

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
    filterContext.Result = new HttpUnauthorizedResult(); 
} 

bir kullanıcı yetkisi yok iken denetim yapmaya çalışıyorsanız, değil özel AuthorizeAttribute yılında, ActionResult işleyicisi içine denetim koymak gerekir: Örneğin, burada AuthorizeAttribute.HandleUnauthorizedRequest varsayılan uygulamasıdır. Bu, denetimin sadece ActionResult yürütülürse (yani, geçerli sayfa yetkilendirilmediyse) yürütüldüğünü garanti eder, her durumda yetkilendirme kontrol edilmez.

public class AuthorizeWithLoggingAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new LoggingActionResult(new HttpUnauthorizedResult(), filterContext); 
    } 
} 

public class LoggingActionResult : ActionResult 
{ 
    private readonly ActionResult innerActionResult; 
    private readonly AuthorizationContext filterContext; 

    public LoggingActionResult(ActionResult innerActionResult, AuthorizationContext filterContext) 
    { 
     if (innerActionResult == null) 
      throw new ArgumentNullException("innerActionResult"); 
     if (filterContext == null) 
      throw new ArgumentNullException("filterContext"); 

     this.innerActionResult = innerActionResult; 
     this.filterContext = filterContext; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     // Do logging (or apparently you want auditing) here 
     Log(this.filterContext); 

     innerActionResult.ExecuteResult(context); 
    } 
} 

NOT: açıkça bu durumda günlük değil, denetleme istiyorum çünkü onlara AuthorizeWithAuditingAttribute ve AuditingActionResult isim olacaktır.