2010-12-03 34 views
25

Active Directory'ye karşı ASP.NET MVC'de kullanıcı ve grupları kullanarak kimlik doğrulamayı deniyorum.ASP .NET MVC Forms Yetkilendirme Active Directory gruplarıyla

Ben (hesap sınıfında hariç) tüm sınıfları Aşağıdaki öznitelik koyduk:

[Authorize (Roles="SubcontractDB Users")] 

Bu grup OU = Area-> OU = groups-> OU = Şirket-> CN = altında bulunan Aktif dizinde SubcontractDB. Ben de ben yaptığımız girişimlerden web.config'de kurulum için bir roleManager gerek farz ediyorum şu:

<roleManager defaultProvider="ADRoleProvider"> 
    <providers> 
    <clear /> 
     <add name="ADMembershipProvider" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider" 
      connectionStringName="ADConnectionString" 
      attributeMapUsername="sAMAccountName" /> 
    </providers> 
</roleManager> 

Benim bağlantı dizesidir: ben yapıyorum

Açıkçası
<add name="ADConnectionString" 
     connectionString="LDAP://blah.com:389/DC=blah,DC=wateva,DC=com"/> 

Bu işe yaramazsa yanlış. Tek yapmak istediğim, AD'deki belirli bir grubun üyesi olan kullanıcılara erişim sağlamaktır. Sadece olabilir: Aşağıdaki yukarıdaki denetleyicileri veya fonksiyonlarını

Using Application.Filters; 
... 
[AuthorizeAD(Groups = "groupname")] 

NB

namespace Application.Filters 
{ 
    public class AuthorizeADAttribute : AuthorizeAttribute 
    { 
     public string Groups { get; set; } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      /* Return true immediately if the authorization is not 
      locked down to any particular AD group */ 
      if (String.IsNullOrEmpty(Groups)) 
       return true; 

      // Get the AD groups 
      var groups = Groups.Split(',').ToList<string>(); 

      // Verify that the user is in the given AD group (if any) 
      var context = new PrincipalContext(ContextType.Domain, "server"); 
      var userPrincipal = UserPrincipal.FindByIdentity(context, 
               IdentityType.SamAccountName, 
               httpContext.User.Identity.Name); 

      foreach (var group in groups) 
       if (userPrincipal.IsMemberOf(context, IdentityType.Name, group)) 
        return true; 
     } 
     return false; 
     } 
    } 
} 

Sonra basitçe kullanabilirsiniz:

+0

mi size web.config aşağıdakileri ekleyin gerekir AuthorizeAttribute ile bu kullanmak için Yetkilendirirken kimlik sorulmasını engellemenin bir yolu var mı? Bir intranet sitesinde windows auth kullanıyorum ve AD grubuna göre güvenli olması ve kullanıcıdan kimlik bilgilerini istememesi gerekir. – Fireworks

cevap

29

Bu yüzden kendi authorize özniteliği uygulayan ve kullanan sona erdi new PrincipalContext(ContextType.Domain); kullanın, ancak .NET 4.0 (0x80005000) hata userPrincpal.IsMemberOf(...) atıyor bir hata var. Detaylar için bakınız here. Adding an error message to the view model based on controller attribute in ASP.NET MVC

+0

Burada yaptığınız şeyden hoşlanıyorum, birisinin yetkilendirilmiş olduğu gerçeğini önbelleğe almak için basit bir tanımlama bilgisine güveniyor olmanız dışında. Bir authUserGroups çerezini manuel olarak eklemem ve ilk bir AD kontrolünü atlamayı neleri engellemeliyim? – Tr1stan

+0

İyi nokta, çerez bölümü kaldırıldı. – link664

+0

Bunu yapmanın yanlış yolu budur. Benim ASP.NET MVC kullanarak intranet site oluşturma msdn.microsoft.com/en-us/library/gg703322(VS.98).aspx AspnetWindowsTokenRoleProvider sınıfını kullanmanız gerekir – RickAndMSFT

31

Bu ASP.NET MVC 3 Bu işlevin için kendi özelliğini uygulamak için artık gerekli değil:

başarısız yetkiye dayanarak başka bir sayfaya yönlendirme nasıl bilmek istiyorsanız

, işte cevabı kontrol et. AspNetWindowsTokenRoleProvider, Active Directory kullanıcıları ve grupları ile çalışır. Bunu gibi Active Directory Grupları başvurabilir, senin kontrolörleri veya eylem yöntemleri,

<authentication mode="Windows" /> 

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"> 
    <providers> 
     <clear /> 
     <add 
      name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider" 
      applicationName="/" /> 
    </providers> 
</roleManager> 

Sonra:

[Authorize(Roles = "YOURDOMAIN\\Group1, YOURDOMAIN\\Group2")] 
+3

Bu, Form kimlik doğrulaması kullanıldığında veya yalnızca Windows kimlik doğrulaması kullanılırken işe yarar mı? – link664

+2

Sorunun cevabının hayır olduğuna inanıyorum: http://stackoverflow.com/questions/2610377/how-can-i-provide-an-asp-net-forms-authentication-ux-while-using-active-directory/2634718 # 2634718 – link664

+0

Bu kesinlikle işe yaramaz, AD grupları için değil, Roller için değil, yalnızca Kullanıcılar (AD kullanıcıları) için sadece Kullanıcılar = "DOMAIN \\ Kullanıcı adı" çalışır. Ben neden Rolls = "DOMAIN \\ Group" 'benim için hiç çalışmaz anlamıyorum. –

İlgili konular