2010-07-30 18 views
7

Güncelleme: yardımına sayesinde burada aşağıdaki çözümü oluşturduk: Ben NerdDinner başladı ve benim üyelik sağlayıcısı olarak ActiveDirectory ile FormsAuthentication kullanıyorumözniteliği, erişim engellendi yerine kullanıcı oturum açmasını ister?

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs 
     // If user is not logged in prompt 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     // Otherwise deny access 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary { 
       {"controller", "Account"}, 
       {"action", "NotAuthorized"} 
      }); 
     } 
    } 
} 

. Global.asax & AccountController (aşağıda) ile db aracılığıyla roller için destek ekledim.

Şimdi denetleyicimde Yetkilendirmem özniteliğimi yalnızca yönetici rollerine (aşağıda) ayarladım. Giriş yapmış kullanıcım bir yazar. Silmeyi tıkladığımda, daha önce yapmış olduğum halde giriş yapmamı ister. Erişimi reddedilmiş bir görünüme döndürmek için mantığı nereye yerleştirebilirim?

Global.asax.cs

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie == null || authCookie.Value == "") 
     { 
      return; 
     } 

     FormsAuthenticationTicket authTicket = null; 

     try 
     { 
      authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     } 
     catch 
     { 
      return; 
     } 

     if (Context.User != null) 
     { 
      string[] roles = authTicket.UserData.Split(new char[] { ';' }); 
      Context.User = new GenericPrincipal(Context.User.Identity, roles); 
     } 
    } 

AccountController.cs

[HttpPost] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", 
     Justification = "Needs to take same parameter type as Controller.Redirect()")] 
    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) 
    { 

     if (!ValidateLogOn(userName, password)) 
     { 
      ViewData["rememberMe"] = rememberMe; 
      return View(); 
     } 

     // Make sure we have the username with the right capitalization 
     // since we do case sensitive checks for OpenID Claimed Identifiers later. 
     userName = this.MembershipService.GetCanonicalUsername(userName); 

     // Lookup user's (CWID) appropriate access level 
     string accessLevel = userRepository.FindUserByUserName(userName).AccessLevel.LevelName; 

     FormsAuthenticationTicket authTicket = new 
         FormsAuthenticationTicket(1, //version 
         userName, // user name 
         DateTime.Now,    //creation 
         DateTime.Now.AddMinutes(30), //Expiration 
         rememberMe, //Persistent 
         accessLevel); // hacked to use roles instead 

     string encTicket = FormsAuthentication.Encrypt(authTicket); 
     this.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

SpotlightController.cs Sana AuthorizeAttribute türetme ve ardından HandleUnauthorizedRequest geçersiz kılmak ve koyabiliriz

[Authorize(Roles="Admin")] 
    public ActionResult Delete(int id) 

cevap

5

AuthorizeAttribute, kutudan çıktığında ne yapar: Geçerli kullanıcının geçerli istek için geçerli olup olmadığını denetler ve oturum açılmadığı için HHTP 401/UNAUTHORIZED değerini döndürür. hiç ya da mevcut istek için yetkili kullanıcıların/rollerin listesinde değiller.

loginUrl özniteliği web.config dosyasında yapılandırılmışsa, Web forms authentication HTTP module sees this 401 response, intercepts that, and turns it into an HTTP 302 (redirect) response to the login page. Genel düşünce, bir kullanıcı giriş yapmamış oldukları için siteye erişim engellendiyse, ancak giriş yapacakları bir sonraki şey giriş yapmaktır.

Yapmak istediğiniz şey başka bir yere yönlendirmektir, Hal'in önerisi HandleUnauthorizedRequest ve yönlendirme geçersiz kılma mantıksız değildir. Kimlik doğrulaması olmayan kullanıcıların hala giriş sayfasını (kimlik doğrulaması yerine, izin verilen kullanıcıların/rollerin listesinde değil) görmesini istiyorsanız, bunun için mantık eklemeniz gerekeceğini unutmayın. AuthorizeCore veya OnAuthorization'ı geçersiz kılma fikrine karşı tavsiye ederim; Bunların hiçbiri gerçekten sorunu çözmez ve onlar HandleUnauthorizedRequest'den daha fazla hata yapmaktan daha kolaydır.

+0

Craig kesinlikle haklı - bir roller istisnası kimliği doğrulanmamış bir kullanıcı ile ele almak zorunda kalacaktı. Bunun çok zor olacağını düşünmüyorum, ama denemedim ki YMMV. Kendi kimlik doğrulama planınızı gerçekten uygulamak istemediğiniz sürece, AuthorizeCode veya OnAuthorization ile uğraşmanızı öneriyorum. – Hal

+0

Daha fazla okumam gerek. Bu arada, HandleUnauthorizedRequest'i geçersiz kılarak bazı yardımları kullanabilirim. AuthorizeAttribute öğesinden devraldığım ve sonra da HandleUnauthorizedRequest'i geçersiz kılan kendi sınıfımı nasıl açacağımı anlıyorum. Kendi özelliklerine ihtiyacım yok çünkü değişmekte olduğum tek şey bu. Peki, türetmeden HandleUnauthorizedRequest nasıl geçersiz kılınacak? – ryan

+0

Yeni bir tür türetmeli ve bu yöntemi geçersiz kılmalısınız. Ama bu yöntem değişmeniz gereken tek şey. –

2

senin orada kendi yönlendirme mantığı.

sayesinde

Hal

+0

Artık HandleUnauthorizedRequest'in neden bir şey yapmadığına dair bir eksikim var. Yoksa sadece bu olayı yakalamam mıyım? – ryan

+0

Oturum açmış olan kullanıcınız bir Yazar hakkı değil, Yönetici değil misiniz? İstenilen davranış, yetersiz ayrıcalığa sahip bir kullanıcının bir özel durum sayfasına yönlendirilmesidir, yükseltilmiş kimlik bilgileriyle giriş yapmaya çalışan bir sayfa (varsayılan davranış olduğuna inanıyorum). Doğru anlıyor muyum? – Hal

+0

Bu doğru! – ryan

1

Alternatif Yetki özelliğini geçersiz olabilir. OnAuthorization yöntemini geçersiz kılacak ve sonucu Base'den AuthorizeCore yönteminden alabileceksiniz. Bu sonuca dayanarak bir istisna veya özel bir istisna (yani, durumu günlüğe kaydeden bir özel güvenlik istisnası) doğrudan OnAuthirziation içinden atabilirsiniz.

İlgili konular