2009-06-03 19 views
5

BenASP.NET MVC'deki belirli sayfalara erişimi nasıl kısıtlarım?

a) Identity.IsAuthenticated = false

ya da doğrulanır ancak

eğer bir kullanıcının DÜZENLEME sayfasında (örn. /user/pure.krome/edit) erişimi kilitleme isteyen b) Idenitity.Name! = Düzenlemeye çalıştıkları kullanıcı sayfasının kullanıcı adı
c) Identity.UserType()! = UserType.Administrator // RoleProviders kullanmadan bir Role gibidir.

Bir denetleyici veya denetleyicinin eylem yöntemini bir şeyle (ler) dekore edebileceğimi varsayalım, ama ne olduğundan emin değilim?

cevap

3

AuthorizeAttribute elde edilmiş özel bir nitelik bunu yapmak kullandığınız yöntemdir. OnAuthorize yöntemini geçersiz kılın ve kendi mantığınızı uygulayın.

public class OnlyUserAuthorizedAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorize(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizeResult(); 
     } 
     ... 
    } 
} 
+0

İlginç ... ama ... kendi mantığımı değiştirmem gerektiğini biliyorum. Ama senin kodun sadece cevap bölümü (a). Ayrıca (c) 'yi de kontrol edebilirim. Ancak, kodun neyi kontrol edeceğini bilemez diye bir fikrim yok (b). Identity.Name var ... ama bu özellik - bu zaman noktasında - görüntüleme verilerinin ne olduğunu nasıl biliyor? ya da eylem metodundaki herhangi bir veri (henüz çalıştırılmamış olduğunu farz ediyorum), çünkü öznitelikleri ilk olarak ele alınıyor. –

+0

AuthorizationContext parametresi, Denetçiye, HttpContext, ResultContext, RouteData ve Sonuç'a yapılan başvuruları içerir. RouteData'dan ihtiyacınız olan her şeyi alabilme.Genelleştirmek için, kullanıcının adı için kullanılacak rota veri anahtarını belirlemenizi sağlayan özniteliğinize bir özellik ekleyin.Kullanıcı türünü bağımsız olarak kontrol etmek için DB işlerini yapmanız gerekir. İki yapıcıya sahip olmak isteyebilirsiniz: veritabanı bağlamı/katman arabiriminizi ve parametrelerinizi alan ve varsayılan veritabanı bağlamını/katmanı oluşturan bir diğeri. Birim testinde eskiyi kullan. – tvanfosson

2

Aşağıdaki ActionFilterAttribute'u uygulamam ve hem kimlik doğrulama hem de rolleri işlemek için çalışır. Böyle kendi DB tablolarında roller depolamak.Bu:

  • UserRole
  • public class CheckRoleAttribute : ActionFilterAttribute 
    { 
        public string[] AllowedRoles { get; set; } 
    
    
        public override void OnActionExecuting(ActionExecutingContext filterContext) 
        { 
         string userName = filterContext.HttpContext.User.Identity.Name; 
    
         if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
         { 
          if (AllowedRoles.Count() > 0) 
          { 
           IUserRepository userRepository = new UserRepository(); 
           User user = userRepository.GetUser(userName); 
           bool userAuthorized = false; 
           foreach (Role userRole in user.Roles) 
           { 
            userAuthorized = false; 
            foreach (string allowedRole in AllowedRoles) 
            { 
             if (userRole.Name == allowedRole) 
             { 
              userAuthorized = true; 
              break; 
             } 
            } 
           } 
           if (userAuthorized == false) 
           { 
            filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true); 
           } 
          } 
          else 
          { 
           filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true); 
          } 
         } 
         else 
         { 
          filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + String.Format("?ReturnUrl={0}", filterContext.HttpContext.Request.Url.AbsolutePath), true); 
         } 
    
    
        } 
    

    böyle diyoruz

  • Rol (kullanıcı kimliği ve RolNo yabancı anahtarları içerir)

    • Kullanıcı bu ...

      [CheckRole(AllowedRoles = new string[] { "admin" })] 
          public ActionResult Delete(int id) 
          { 
           //delete logic here 
          } 
      
  • +0

    Yukarıdaki ilk satırda "* kimlik doğrulama * ve roller" – mikerennick

    +0

    Mikerennick, kullanıcıların veya rollerin önbelleğe alınıyor musunuz? –

    +0

    Önbelleğe alma kullanmıyorum - ancak listenin nedenini göremiyorum Bir kullanıcıya atanan rollerin önbelleğe alınamadı. Atanan roller için değişiklikler yapıldığında önbelleği güncelleyebilirsiniz. Yukarıdaki kod, sadece geçerli kullanıcı için httpcontext'e baktığım için, kullanıcıların önbelleğe alınmasına dayanıyor. İzin verilen kullanıcılara yönelik bir çek eklenmesinin, ilke olarak izin verilen rollerin kontrolü ile aynı olduğundan söz etmeliyim. – mikerennick

    İlgili konular