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.
Câu hỏi hay - đang chờ câu trả lời tuyệt vời! –
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. –
Thử bài đăng này: http://stackoverflow.com/questions/2539038/iis7-mixed-mode-authentication – Tjaart