2009-08-14 19 views
28

Ben Özel bir rol sağlayıcısı kuruyorum kullanarak bir erişim engellendi sayfaya yönlendirme ve ben bir yetkilendirme benim denetleyicisi bir rol belirterek özniteliği ayarlanmış ve bunun gibi, sadece iyi çalışıyor:ASP.NET MVC özel bir rol sağlayıcısı

[Authorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 
... 

Ancak bir kullanıcı bu denetleyiciye erişemediğinde, giriş sayfasına yönlendirilir. Onu bir "AcessDenied.aspx" sayfasına nasıl yönlendirebilirim?

cevap

42
[AccessDeniedAuthorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if(filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectResult("~/AcessDenied.aspx"); 
     } 
    } 
} 
+6

Kullanıcı giriş yaptıysa ve sayfaya erişmeye çalışırsa, AccessDenied sayfasına yönlendirilir. İyi. Ancak, kullanıcı giriş yapmadıysa, AccessDenied sayfasına yönlendirilir. Kötü.Bu durumda, Giriş sayfasına yönlendirilirler. –

+3

Sayfanın artık kullanıcının içinde olmadığı durumda normal olarak yeniden yönlendirilmesini isterseniz, base.OnAuthorization() yöntem çağrısından sonra, Threading.Thread.CurrentPrincipal öğesinin olup olmadığını kontrol eden kodun geri kalanında bir if ifadesi ekleyin. Identity.IsAuthenticated. Bu şekilde kullanıcı kimlik doğrulaması yapılmadığı sürece kullanıcı AccessDenied sayfasına yönlendirilir. Bu durumda, varsayılan eylemi (giriş sayfasına yönlendirmek) – Frinavale

+0

bu sınıf nereye koyulur? kontrol cihazında? – Jay

8

tvanfosson 'ın Answerthis very similar question gelen bir göz atın, bu nedenle şimdi sadece söylemek zorunda (tvanfosson sayesinde) yapıyorum budur:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")] 
public class SuperAdminController : Controller 
... 

Kullanıcı rolde değilse, W görünümü ViewName tarafından belirtilir.

22

İşte benim çözümüm, eu-ge-ne'nin cevabına dayanıyor. Mine, kullanıcı giriş yapmamışsa Giriş sayfasına doğru bir şekilde yönlendirir, ancak oturum açmışlarsa ancak bu sayfayı görüntülemek için yetkilendirilmemişse Erişim Reddedildi sayfasına yönlendirir.

[AccessDeniedAuthorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new RedirectResult("~/Account/Logon"); 
      return; 
     } 

     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectResult("~/Account/Denied"); 
     } 
    } 
} 

AccountController.cs:

public ActionResult Denied() 
{ 
    return View(); 
} 

Görüntüleme/Hesap/Denied.cshtml: (Jilet sözdizimi)

@{ 
    ViewBag.Title = "Access Denied"; 
} 

<h2>@ViewBag.Title</h2> 

Sorry, but you don't have access to that page. 
+1

Kabul edilen cevaptan mükemmel değişiklik, teşekkürler kardeşim –

6

hafif Matt'in cevabına iyileştirme y sert kodlama gereksinimini Oturum Açma sayfa kaçınarak ve isteğe bağlı özelliğinde erişim engellendi görünümü ayarlamaya: me için farklı erişim engellendi sayfasına sahip sağlamak için ben Vic cevap üzerine inşa ettik

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedViewName { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (string.IsNullOrWhiteSpace(AccessDeniedViewName)) 
       AccessDeniedViewName = "~/Account/AccessDenied"; 

      filterContext.Result = new RedirectResult(AccessDeniedViewName); 
     } 
    } 
} 
0
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 

      if (filterContext.Result is HttpUnauthorizedResult && WebSecurity.IsAuthenticated) 
      { 
       filterContext.Result = new RedirectResult("~/Account/AccessDenied"); 
      } 
     } 
    } 
0

uygulamanın her bir alanı. Vic Alcazar Sadece küçük bir güncelleme

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedController { get; set; } 
    public string AccessDeniedAction { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction)) 
      { 
       AccessDeniedController = "Home"; 
       AccessDeniedAction = "AccessDenied"; 
      } 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction })); 
     } 
    } 
} 
0

, Eklendi ayrıntıları: o anki bölgenin denetleyicisi ve eylem yönlendirir uygulamanın köküne bir URL'nin yerine bir RedirectToRouteResult dönen, hangi yerine yönlendirerek Yaptım yönlendirme istek url'nin Yani inkar erişim ayrıntılarını log ve

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedViewName { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (string.IsNullOrWhiteSpace(AccessDeniedViewName)) 
       AccessDeniedViewName = "~/Account/AccessDenied"; 

      var requestUrl = filterContext.HttpContext.Request.Url; 

      filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl)); 
     } 
    } 
} 
5

yönlendirme her zaman en iyi çözüm

Kullanım stan değildir isteyenler eğer seçebilirsiniz dard http code 403:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden);