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.
Neden kodunuzdaki 'AuthorizeAttribute'' OnOuthorization' yöntemine ilişkin tüm başvuruları bulamıyorsunuz? –
Hangi MVC sürümünü kullanıyorsunuz? –
@AmateurProgrammer Yaptım. Dislodge etmek zor. Her şeyi tekrar yapabilirsek, bunu farklı yapardık. – Arithmomaniac