2008-12-01 31 views
34

Trong trang aspx, tôi nhận tên người dùng Windows có chức năng Request.LogonUserIdentity.Name. Hàm này trả về một chuỗi theo định dạng "domain \ user".Cách nhận tên người dùng không có tên miền

Có chức năng nào để chỉ nhận tên người dùng mà không cần sử dụng số IndexOfSubstring, như thế này không?

public static string StripDomain(string username) 
{ 
    int pos = username.IndexOf('\\'); 
    return pos != -1 ? username.Substring(pos + 1) : username; 
} 

Trả lời

29

Tôi không tin như vậy. Tôi đã có tên người dùng sử dụng các phương pháp before-

System.Security.Principal.IPrincipal user = System.Web.HttpContext.Current.User; 
System.Security.Principal.IIdentity identity = user.Identity; 
return identity.Name.Substring(identity.Name.IndexOf(@"\") + 1); 

hoặc

Request.LogonUserIdentity.Name.Substring(Request.LogonUserIdentity.Name.LastIndexOf(@"\") + 1); 
+0

Request.LogonUserIdentity.Name chỉ hoạt động cho biểu mẫu đăng nhập để đăng nhập tên người dùng trên miền khi tạo biểu mẫu đăng nhập sử dụng LDAP. Phần còn lại yêu cầu cửa sổ auth bật lên tôi tin. – RandomUs1r

5

Nếu bạn đang sử dụng .NET 3.5 bạn luôn có thể tạo ra một phương pháp mở rộng của lớp WindowsIdentity rằng làm việc này cho bạn.

public static string NameWithoutDomain(this WindowsIdentity identity) 
{ 
    string[] parts = identity.Name.Split(new char[] { '\\' }); 

    //highly recommend checking parts array for validity here 
    //prior to dereferencing 

    return parts[1]; 
} 

như vậy tất cả các bạn phải làm bất cứ nơi nào trong mã của bạn là tài liệu tham khảo:

Request.LogonUserIdentity.NameWithoutDomain();

1
static class IdentityHelpers 
{ 
    public static string ShortName(this WindowsIdentity Identity) 
    { 
     if (null != Identity) 
     { 
      return Identity.Name.Split(new char[] {'\\'})[1]; 
     } 
     return string.Empty; 
    } 
} 

Nếu bạn bao gồm mã này, bạn có thể sau đó chỉ cần làm điều gì đó như:

WindowsIdentity a = WindowsIdentity.GetCurrent(); 
Console.WriteLine(a.ShortName); 

Rõ ràng trong một môi trường web, bạn sẽ không ghi vào giao diện điều khiển - chỉ là một ví dụ ...

11

Lấy các bộ phận [1] không phải là cách tiếp cận an toàn. Tôi muốn sử dụng LINQ .Last():

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); 
if (windowsIdentity == null) 
    throw new InvalidOperationException("WindowsIdentity is null"); 
string nameWithoutDomain = windowsIdentity.Name.Split('\\').Last(); 
+1

Cách tiếp cận này sẽ cho kết quả sai mặc dù nếu 'Tên' không chứa dấu gạch chéo ngược vì một số lý do (ví dụ: Nhóm làm việc?) –

46

Nếu bạn đang sử dụng Xác thực Windows. Điều này chỉ đơn giản có thể đạt được bằng cách gọi System.Environment.UserName sẽ chỉ cung cấp cho bạn tên người dùng. Nếu bạn chỉ muốn tên miền bạn có thể sử dụng System.Environment.UserDomainName

+0

Tốt nhất. Không biết điều này ... – doekman

+0

@Robin V., bạn có biết điều gì xảy ra nếu bạn sử dụng 'runas' và tương tự không ?, tôi đoán là các biến System.Environment chỉ phản ánh người dùng đã đăng nhập, không phải là danh tính chạy tiến trình .NET (có thể không giống nhau) – Sebastian

+1

ứng dụng của tôi đang chạy với tư cách là tôi và điều này trả về "iis pool" cho tôi. Khá chắc chắn câu hỏi nêu aspx, tôi tin rằng điều này sẽ làm việc trong winforms mặc dù. – RandomUs1r

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