2009-03-12 12 views
5

Có cách nào tốt để kết hợp Xác thực Windows ASP.NET với đối tượng IPrincipal/IIdentity tùy chỉnh không? Tôi cần phải lưu trữ địa chỉ email của người dùng và đã làm như vậy để xác thực biểu mẫu bằng cách sử dụng cặp IIdentity/IPrincipal tùy chỉnh mà tôi đã thêm vào Context.CurrentUser trong sự kiện AuthenticateRequest.IPrincipal tùy chỉnh cùng với WindowsAuthentication

Làm cách nào tốt nhất để thực hiện điều này bằng WindowsAuthentication?

Trả lời

3

Có lẽ bạn có thể tạo "ExtendedWindowsPrincipal" làm lớp dẫn xuất dựa trên WindowsPrincipal và chỉ thêm dữ liệu thừa vào lớp dẫn xuất?

Bằng cách đó, ExtendedWindowsPrincipal của bạn sẽ vẫn được nhận ra ở bất cứ nơi nào cần có WindowsPricinpal. HOẶC: Vì bạn đang nói về việc sử dụng Xác thực Windows, có thể bạn đang ở trong mạng Windows - có một Thư mục Họat động hoặc cơ sở dữ liệu người dùng ở đâu đó, nơi bạn có thể tra cứu địa chỉ email của mình quan tâm thay vì lưu trữ nó trong hiệu trưởng?

Marc

+0

Tạo một lớp dẫn xuất là ý tưởng của tôi, nhưng tôi không chắc chắn về nếu nó là khôn ngoan để thay thế IPrincipal và làm thế nào nó được thực hiện một cách chính xác. Tôi định tìm kiếm địa chỉ email từ thư mục, nhưng ý tưởng của tôi là thu thập tất cả thông tin người dùng ở một nơi, giống như tôi đã thực hiện w. xác thực tùy chỉnh. – PHeiberg

+0

Tôi không thấy bất kỳ vấn đề thay thế một WindowsPrincipal bởi ExtendedWindowsPrincipal của riêng bạn, nếu nó là một lớp dẫn xuất. Sau khi tất cả, nó vẫn là một WindowsPrincipal - với một số công cụ bổ sung. Để làm điều đó, tôi sẽ điều tra global.asax và Application_AuthenticateRequest. –

+0

Tôi gặp vấn đề với việc cố gắng để IsInRole vẫn hoạt động và không muốn đầu tư thời gian vào sử dụng IPrincipal, vì vậy tôi đã kết thúc việc đưa phần còn lại của thông tin người dùng vào các mục ngữ cảnh. Cảm ơn sự giúp đỡ. – PHeiberg

3

Tôi đã kết thúc tái cấu trúc giải pháp ban đầu của mình để thay thế Hiệu trưởng thay vì nhận dạng như tôi nghĩ ban đầu. Thay thế Identity tỏ ra rắc rối, vì tôi gặp phải các vấn đề bảo mật khi tạo một thể hiện của một WindowsPrincipal mở rộng mới.

public class ExtendedWindowsPrincipal : WindowsPrincipal 
{ 
    private readonly string _email; 

    public ExtendedWindowsPrincipal(WindowsIdentity ntIdentity, 
     string email) : base(ntIdentity) 
    { 
      _email = email; 
    } 

    public string Email 
    { 
     get { return _email; } 
    } 
} 

Trong mô-đun xác thực của tôi thay thế hiệu trưởng trên HttpContext như thế này:

var currentUser = (WindowsIdentity)HttpContext.Current.User.Identity; 
HttpContext.Current.User = 
    new ExtendedWindowsPrincipal(currentUser, userEmail); 
+0

cảm ơn bài đăng, đã đập đầu tôi trong vài giờ. Chạy vào cùng một vấn đề bảo mật ... wtf! đúng? Giải pháp của bạn làm việc mặc dù, cảm ơn nhiều! –