2012-01-24 37 views
7

Tôi hiện đang cố gắng tìm ra cách thực hiện xác thực cửa sổ thủ công trong Ứng dụng ASP.NET của chúng tôi. Vấn đề là chúng tôi có một dịch vụ OData đang chạy và sử dụng FormsAuthentication để cung cấp cơ chế đăng nhập chung và cho phép các động từ DELETE của PUT & cho OData, bao gồm cả chuyển hướng biểu mẫu.Xác thực Windows thủ công

Tuy nhiên, đối với một số khách hàng, chúng tôi đã tích hợp Xác thực Windows để cho phép tích hợp trơn tru cho người dùng của họ bằng thư mục hoạt động. Vấn đề bây giờ là chúng ta muốn có thể chuyển đổi các phương thức xác thực mà không phá vỡ dịch vụ Odata, bởi vì chúng ta phụ thuộc vào nó.

Những gì chúng tôi đang cố làm là bắt chước cơ chế Xác thực Windows bằng cách sử dụng IhttpModule. Cho đến nay, chúng tôi có thể bật tính năng này trên số & và chúng tôi nhận được thách thức khi yêu cầu được thực hiện. Những gì tôi không biết là làm thế nào để sử dụng các thông tin nhận được từ trình duyệt để thực hiện xác thực chống lại các hoạt động thư mục:

Đây là mã chúng tôi sử dụng để trích xuất các thông tin NTLM từ yêu cầu hiện tại:

/// <summary> 
/// <para>Determines whether the current <see cref="HttpRequest"/> is a NTML challenge.</para> 
/// </summary> 
/// <param name="request">The <see cref="HttpRequest"/> to evaluate.</param> 
/// <param name="header">The output header to authenticate.</param> 
/// <returns>True if the current <see cref="HttpRequest"/> is considered a NTML challenge.</returns> 
protected bool IsNtlmChallenge(HttpRequest request, out string header) 
{ 
     const string headerName = @"Authorization"; 
     if (request.Headers.AllKeys.Contains(headerName)) 
     { 
      header = request.Headers[headerName]; 
      return true; 
     } 

     header = string.Empty; 
     return false; 
} 

Điều này cho phép chúng tôi trích xuất tiêu đề từ yêu cầu. Những gì tôi cần biết bây giờ là làm thế nào tôi thực hiện xác thực với điều này trên thư mục hoạt động.

Đây là logic chúng tôi sử dụng để trích xuất các thông tin:

// Check if we need to handle authentication through Windows authentication or not. 
if (WindowsAuthentication) 
{ 
    string encryptedHeader; 

    // If this is a challenge from the client, perform the Windows Authentication using the 
    // information stored inside the header. 
    if(IsNtlmChallenge(HttpContext.Current.Request, out encryptedHeader)) 
    { 
     /* how to authenticate here with the encrypted header? */ 
    } 

    HttpContext.Current.Response.AddHeader("WWW-Authenticate", "NTLM"); 
    HttpContext.Current.Response.StatusCode = 401; 
    return; 
} 

Hope ai đó có thể cung cấp các anwser mà tôi cần.

+0

Câu hỏi hay - đang chờ câu trả lời tuyệt vời! –

+0

Tôi nghi ngờ rằng có thể kết hợp các hình thức và xác thực cửa sổ theo cách đó. Đối với winauth, bạn phải kích hoạt nó trong IIS (vì IIS là một trong đó sẽ thẩm định các thông tin này), và win-auth và forms-auth không thể làm việc cùng nhau trong một số thiết lập IIS (ví dụ như IIS7 + tích hợp ứng dụng). Ngoài ra, chỉ có một chế độ xác thực mà bạn có thể chỉ định trong web.config. Trong khi với hồ bơi ứng dụng cổ điển, bạn có thể trộn auth, nhưng không phải trên cùng một tệp/thư mục. Nếu đây là những gì bạn đang chạy, hãy bật win-auth trên đường dẫn thư mục/tệp/url cụ thể (ví dụ: xử lý aspx), sau đó sử dụng trình xử lý đó để xác thực người dùng win/AD. –

+0

Thử bài đăng này: http://stackoverflow.com/questions/2539038/iis7-mixed-mode-authentication – Tjaart

Trả lời

0

Được rồi,

dựa trên các nhận xét nhận được về câu hỏi của tôi, tôi đã đưa ra giải pháp sau để bỏ qua sự cố mà tôi có. Tôi biết nó không phải là một giải pháp sạch, nhưng ít nhất nó hoạt động cho chúng tôi.

  • Tạo một ứng dụng Web mới chạy bên trong ứng dụng của bạn
  • tiểu Ứng dụng này dựa trên Windows Authentication
    • Disable Anonymous Xác thực & hình thức xác thực
  • Tạo một trang Login.aspx rằng xử lý Xác thực Windows
  • Chúng tôi tạo cookie sau khi đăng nhập và chuyển hướng đến ứng dụng gốc
  • Ứng dụng gốc nhận ra cookie và đưa người dùng.

Điều này yêu cầu chúng tôi tạo cùng một khóa để mã hóa & giải mã cho cả hai ứng dụng. Điều này có thể được thiết lập bằng cách sử dụng mô-đun khóa máy trong trình quản lý IIS cho ứng dụng của bạn. Nếu các phím không bằng nhau cho cả hai ứng dụng, quy trình mã hóa/giải mã cho cookie sẽ bị lỗi. Chúng tôi đặt chúng thành tự động tạo bằng SHA1, nhưng cùng các khóa cho cả hai ứng dụng.

Bây giờ, chúng tôi kiểm tra cài đặt trên trang đăng nhập gốc, chuyển hướng đến trang đăng nhập của ứng dụng phụ nếu yêu cầu Xác thực Windows và thực hiện đăng nhập ở đó. Sau đó, chúng tôi chuyển hướng trở lại trang đăng nhập ban đầu và sử dụng cookie để tiếp tục.

Điều này dẫn đến một vài chuyển hướng khi thực hiện đăng nhập ban đầu, nhưng sau đó ứng dụng chạy mượt mà hơn bao giờ hết.

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