Birkaç gün önce bu soruna girdim ve çözüm biraz ayrıntılı ama burada önemli bitler. AuthorizeAttribute
'da, OnAuthorization
yönteminde, özel bir sonucu döndürmeyi biraz zorlaştıran yetkilendirme başarısız olduğunda HttpUnauthorizedResult
yöntemi döndürülür.
Yaptığım şey bir CustomAuthorizeAttribute sınıfı oluşturmak ve bunun yerine bir istisna atmak için OnAuthorization yöntemini geçersiz kılmaktı. Özel bir hata işleyicisiyle bu özel durumu yakalayabilir ve 401'i (Yetkisiz) döndürmek yerine özelleştirilmiş bir hata sayfası görüntüleyebilirim.
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="401" redirect="~/Error/Unauthorized" />
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
ve ardından özel sayfalar kadar hizmet için kendi ErrorController uygulamak:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public virtual void OnAuthorization(AuthorizationContext filterContext) {
if (filterContext == null) {
throw new ArgumentNullException("filterContext");
}
if (AuthorizeCore(filterContext.HttpContext)) {
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
else {
// auth failed, redirect to login page
// filterContext.Result = new HttpUnauthorizedResult();
throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");
}
}
}
sonra web.config belirli hatalar için özel işleyicileri ayarlayabilirsiniz.
IIS7'de, özel hatalarınızı etkinleştirmek için Response.TrySkipIisCustomErrors = true;
ayarlarına bakmanız gerekir.
bu mantığı kullanarak kısmi görünümleri "arkadaş canlısı iletiler" ile düzeltmem gerekiyor mu? Tüm eylem yöntemini, aynı şeyi yapan bir özellik ile kaplamak mümkün değil mi? – Kyle
Yukarıda bir örnek ekledim. Diğer seçeneğiniz elbette bahsettiğiniz gibi kendi özniteliklerinizi yazmanızdır (bu, en iyisi ünite testine rağmen en temiz olanı olacaktır), fakat bu kesinlikle kutu dışı bir yaklaşım değildir. –