2012-06-21 11 views
7

Tại sao mã bên dưới hoạt động tốt khi tôi chạy localhost ứng dụng web của mình nhưng không phải khi tôi cài đặt nó vào máy chủ IIS?System.DirectoryServices.AccountManagement.UserPrincipal - localhost nhưng không phải là iis

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

Vui lòng không đề xuất tôi gắn bó với HttpContext.Current.User vì nó không cung cấp quyền truy cập vào SID hoặc UPN mà không cần thêm cuộc gọi vào Active Directory.

Ứng dụng web sẽ được người dùng được xác thực Windows sử dụng từ ba miền riêng biệt, máy chủ web được lưu trữ trong miền thứ tư. Hồ bơi ứng dụng được định cấu hình để chạy dưới thông tin NetworkService và cấu hình ứng dụng web có mạo danh nhận dạng được đặt thành true.

Các thông báo lỗi khi nó chạy trên IIS là:

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)

EDIT: Cố gắng cả sau và không may gặp phải lỗi tương tự.

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

Trả lời

1

Nó có vẻ như cần một số phương pháp khác để xác định người dùng.
Mô tả từ msdn cho thuộc tính:
"Nhận đối tượng chính của người dùng đại diện cho người dùng hiện tại mà chuỗi đang chạy."
Vì vậy, UserPrincipal.Current trả về người dùng theo những gì IIS đang chạy.

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal.aspx

+0

Tôi nghĩ bạn nói đúng. Điều này không hoạt động ... var wi = HttpContext.Current.User.Identity as WindowsIdentity; sử dụng (wi.Impersonate()) { UserPrincipal up = UserPrincipal.Current; activeUserUPN = up.UserPrincipalName; activeUserSid = up.Sid.ToString(); } – RichardD

+1

"người dùng hiện tại theo đó chuỗi đang chạy" trong IIS rất có thể là Bản sắc Hồ bơi ứng dụng IIS; nhưng khi chạy trên PC của bạn trong Visual Studio, Casini hoặc IIS Express, nó đang chạy như bạn. Trong trường hợp đó, danh tính của bạn được chia sẻ bởi khách hàng yêu cầu trang và máy chủ phát triển đang chạy cục bộ. –

3

Tôi đã gặp rất nhiều vấn đề khi triển khai UserPrincipal.Current và vẫn không hiểu rõ lý do.

Cuối cùng tôi đã kết thúc bằng cách sử dụng PrincipalSearcher và tạo chức năng sau để làm những gì tôi nghĩ UserPrincipal.Current đang làm.

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; 
    } 
} 

Và tôi đã thông qua System.Web.HttpContext.Current.User.Identity.Name vào phương thức đó làm userName.

+0

Tôi nhận được lỗi này: 'System.ObjectDisposedException: Không thể truy cập đối tượng được xử lý. Tên đối tượng: 'PrincipalContext'. tại System.DirectoryServices.AccountManagement.PrincipalContext.CheckDisposed() tại System.DirectoryServices.AccountManagement.PrincipalContext.get_ContextType() tại System.DirectoryServices.AccountManagement.Principal.get_Name() tại System.String.Concat (Object [] args) tại Admin_Click (Người gửi đối tượng, EventArgs e) ' – SearchForKnowledge

+1

Tôi đã thử nhiều thứ trong Ứng dụng MVC của mình. 'DirectoryEntry de = new DirectoryEntry (" WinNT: // "+ Môi trường.UserDomainName + "/" + userId); chuỗi Username = de.Properties [ "FullName"] Value.ToString();. ' Sau đó, tôi đã cố gắng' System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName; ' Sau đó Cố gắng giải pháp của bạn, và nó là chỉ có một để làm việc khi triển khai ra máy chủ sản xuất của tôi ... không chắc chắn tại sao. Tất cả làm việc tại địa phương ... –