2012-06-21 25 views
7

Web uygulama yerel sunucumu çalıştırdığımda aşağıdaki kodu neden düzgün çalışıyor, ancak bir IIS sunucusuna yüklediğimde değil? Active Directory için ek aramalar olmadan SID veya UPN erişimi sağlamaz olarakSystem.DirectoryServices.AccountManagement.UserPrincipal - localhost ancak iis değil

using (HostingEnvironment.Impersonate()) 
{ 
    UserPrincipal activeUser = UserPrincipal.Current; 
    String activeUserSid = activeUser.Sid.ToString(); 
    String activeUserUPN = activeUser.UserPrincipalName; 
} 

Ben HttpContext.Current.User ile sopa önermek etmeyin.

Web uygulaması, Windows kimliği doğrulanmış kullanıcılar tarafından üç ayrı etki alanından kullanılacaktır, web sunucusu dördüncü etki alanında barındırılmaktadır. Uygulama Havuzu, NetworkService kimliğinin altında çalışacak şekilde yapılandırılmıştır ve web uygulaması yapılandırmasında kimlik kimliğine bürünme öğesi true değerine ayarlanmıştır. IIS üzerinde çalışan

hata iletisi:

Error in Page_Load(): UserPrincipal.Current.
System.InvalidCastException: Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal' to type 'System.DirectoryServices.AccountManagement.UserPrincipal'.
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.get_Current()
at webapp.Details.Default.Page_Load(Object sender, EventArgs e)

DÜZENLEME: Güvenilir hem şu ve ne yazık ki aynı hatayı alıyorum.

UserPrincipal userPrincipal = UserPrincipal.Current; 
Response.Write(userPrincipal.Name); 
Principal userOrGroup = UserPrincipal.Current; 
Response.Write(userOrGroup.Name); 

cevap

1

Bu ihtiyacı gibi kullanıcıyı belirlemek için başka bir yöntemi gibi görünüyor.
Özellik msdn için açıklama:
"Kullanıcının içinde çalıştığı geçerli kullanıcıyı temsil eden bir kullanıcı asıl nesnesi alır."
Bu yüzden, UserPrincipal.Current, IIS'nin çalıştığı altından kullanıcıyı döndürür.
http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal.aspx

+0

Sanırım haklısınız. Bu, ya çalışmıyor ... var wi = HttpContext.Current.User.Identity WindowsIdentity; (wi.Impersonate()) kullanarak { UserPrincipal up = UserPrincipal.Current; activeUserUPN = up.UserPrincipalName; activeUserSid = up.Sid.ToString(); } – RichardD

+1

IIS'de "iş parçacığının çalıştığı geçerli kullanıcı" büyük olasılıkla IIS Uygulama Havuzu Kimliği; ancak Visual Studio, Casini veya IIS Express'te PC'nizde çalışırken, sizin gibi çalışıyor. Bu durumda kimliğiniz, sayfayı ve yerel olarak çalışan geliştirme sunucusunu isteyen müşteri tarafından paylaşılır. –

3


Ben UserPrincipal.Current dağıtma sorunların bir sürü vardı ve hala tam olarak neden anlamıyorum.

Sonunda PrincipalSearcher kullanarak sona erdi ve UserPrincipal.Current'ın yaptığını düşündüğüm şeyi yapmak için aşağıdaki işlevi oluşturdum.

private UserPrincipal GetActiveDirectoryUser(string userName) 
{ 
    using(var ctx = new PrincipalContext(ContextType.Domain)) 
    using(var user = new UserPrincipal(ctx) { SamAccountName = userName}) 
    using(var searcher = new PrincipalSearcher(user)) 
    { 
     return searcher.FindOne() as UserPrincipal; 
    } 
} 

Ve userName olarak bu yöntem haline System.Web.HttpContext.Current.User.Identity.Name geçti.

+0

Bu hatayı alıyorum: 'System.ObjectDisposedException: Atılan bir nesneye erişilemiyor. Nesne adı: 'PrincipalContext'. System.DirectoryServices.AccountManagement.PrincipalContext.CheckDisposed() System.DirectoryServices.AccountManagement.PrincipalContext.get_ContextType() at System.DisectoryServices.AccountManagement.Principal.get_Name() at System.String.Concat (Object [] args) at Admin_Click (Object sender, EventArgs e) ' – SearchForKnowledge

+1

MVC Uygulamamda birçok şeyi denedim. 'DirectoryEntry de = new DirectoryEntry (" WinNT: // "+ Ortam.UserDomainName + "/" + userId); dize adı = de.Properties [ "fullName"] Value.ToString();. 'Sonra i' System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName çalıştı; ' Sonra çözüm çalıştı ve oldu Üretim sunucuma dağıtım yaparken çalışmak için sadece bir tane ... emin değilim neden. Tüm yerel olarak çalıştı ... –