2012-06-13 28 views
12

Tôi đang Sử dụng Phương thức UserPrincipal.Current.ToString() trong Miền để Nhận Đăng nhập Hiện tại trong Người dùng Miền có Tên miền Hợp lệ. nhưng khi tôi đang Hiển thị nó trong một chuỗi Lỗi cho nó khi lưu trữ trong IIS Server:Không thể truyền đối tượng thuộc loại trong System.DirectoryServices.AccountManagement.GroupPrincipal

Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal' 
      to type 'System.DirectoryServices.AccountManagement.UserPrincipal'. 
+1

Điều này có hữu ích không? http://stackoverflow.com/a/10848934/43846 – stuartd

Trả lời

14

tôi đã cùng một vấn đề. Nó hoạt động hoàn hảo trên máy cục bộ của tôi nhưng khi triển khai nó đến IIS trên máy chủ nó đã thất bại. Cuối cùng tôi đã phải thay đổi hai điều để làm cho nó làm việc:

  1. Thay đổi sự thẩm định quyền "Windows Authentication" (how-to)

  2. Thay vì sử dụng hiện nay, làm việc đó theo hai bước: (source)

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, User.Identity.Name);

Và để có được tên (hoặc bất kỳ thông tin nào khác), tôi đã sử dụng user.DisplayName.

+3

lỗi này ném cho tôi (& (objectCategory = user) (objectClass = người dùng) (| (userPrincipalName =) (phân biệtName =) (name =))) tìm kiếm bộ lọc không hợp lệ. Mô tả: Một ngoại lệ không được xử lý xảy ra trong khi thực hiện yêu cầu web hiện tại. Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về lỗi và vị trí bắt nguồn từ mã. Chi tiết ngoại lệ: System.ArgumentException: (& (objectCategory = user) (objectClass = user) (| (userPrincipalName =) (phân biệtName =) (tên =))) bộ lọc tìm kiếm không hợp lệ – Kurkula

5

Tôi đã thấy ngoại lệ này khi chạy trong IIS 7 trên Windows 7.

System.Security.Principal .WindowsIdentity.GetCurrent(). Tên trả về "IIS APPPOOL \ ASP.NET v4.0".

Đây là một phần giải thích những gì đang xảy ra, mặc dù IMHO UserPrincipal.Current sẽ xử lý tình huống này một cách duyên dáng hơn.

Tôi nghĩ rằng đó là một lỗi và đã tạo ra một lỗi trên Connect:

http://connect.microsoft.com/VisualStudio/feedback/details/748790/userprincipal-current-throws-invalidcastexception

Là một workaround, sử dụng System.Security.Principal.WindowsIdentity.GetCurrent() để có được bản sắc của một IIS AppPool.

2

Vấn đề ở đây là thuộc tính UserPrincipal.Current sẽ cố gắng truy cập vào ngữ cảnh của chuỗi hiện tại. Tuy nhiên, nếu không có sự mạo danh ASP.NET, nó có nghĩa là danh tính sẽ là bản sắc được cấu hình của nhóm ứng dụng. Ngay cả với ASP.NET mạo danh, nó có để truy cập vào Active Directory một cách nào đó và do đó cần phải xác thực đối với bộ điều khiển miền. Nếu phương pháp xác thực được chọn trong IIS không cung cấp cho phương thức đó, thì có thể xảy ra lỗi tương tự.

Theo kinh nghiệm của tôi, chỉ xác thực "BASIC" và phiên bản "KERBEROS" được triển khai đúng 100% sẽ hoạt động. Hãy nhớ rằng Kerberos không thực sự tương thích với cách các hồ bơi ứng dụng và SPN được xử lý và có khả năng thất bại. NTLM - đó là dự phòng cho xác thực Windows trong IIS - sẽ không hoạt động do thiếu mật khẩu trên Máy chủ.

Một đọc tốt về các vấn đề HTTP/Kerberos là: http://blogs.msdn.com/b/friis/archive/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iis-ie.aspx

Các vấn đề liên quan