2011-09-16 37 views
18

Forms Authentication ile MVC 3 kullanıyorum. Benim denetleyicisi veya yöntemlerin, ben şu yapıyorum:ASP.NET - Yetkilendirme Yetkilendirme Başarısız olursa Hata Sayfasına Yönlendirme

[Authorize (Roles = "developer")] 

Bu durumda, ben kullanıcı ve eğer açmış olup olmadığını kontrol edin giriş sayfasına dönmelerini istiyoruz. Ancak, bu kullanıcı için 'IsInRole' denetimi yanlışsa, 'Yetkisiz' gibi bir şey söyleyen farklı bir görünüme gitmelerini isterim.

Böyle bir şeyi başarmanın en iyi yolu nedir? Yeni bir Yetkilendirme özniteliği oluşturmamaya çalışmayı umuyordum, bu yüzden tüm Authorize özniteliğimi tüm uygulamamda yeniden düzenlemem gerekmedim, ancak gerekli olan buysa, o rotaya gideceğim.

cevap

44

iş yapabilirdi HandleUnauthorizedRequest yöntemi geçersiz kılmasını Özel bir authorize özellik: o zaman

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // The user is not authenticated 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole)) 
     { 
      // The user is not in any of the listed roles => 
      // show the unauthorized view 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "~/Views/Shared/Unauthorized.cshtml" 
      }; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

ve:

[MyAuthorize(Roles = "developer")] 
public ActionResult Develop() 
{ 
    ... 
} 
+0

Bu mükemmel bir şekilde çalıştı. – Brandon

+0

Mükemmel ... teşekkürler ... – Shaz

+3

Bu özel uygulamayı nereye koyarsınız? –

1

Ayrıca 401 durum kodları için özel hata sayfası ile yapabilirsiniz. Uygulama ayrıntıları için bkz: this question.

0

Bunu böyle kullanabilirsiniz. Çünkü yetkiniz yoksa yöntem gelir. Yetkilendirme gerekli değil.

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // The user is not authenticated 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "~/Views/Shared/Unauthorized.cshtml", 
      }; 
     } 
    }