2013-02-01 29 views
5

Tôi có 2 ứng dụng ASP.NET MVC 3. Tôi đang sử dụng mạo danh thông qua web.config để cho phép tôi truy vấn Active Directory để nhận thông tin chi tiết về người dùng. Ứng dụng sử dụng xác thực Windows và không cho phép người dùng ẩn danh. Một ứng dụng là ứng dụng chính mà người dùng thực hiện các nhiệm vụ của họ. Người kia cho phép người dùng thiết lập người dùng khác giống như trong ứng dụng một.Sự mạo danh, Thư mục hoạt động và "người dùng không có quyền đối với xxxx" vấn đề

Người dùng kiểm tra của đang nhận được lỗi sau:

SQL1092N "<DOMAIN ID>" does not have the authority to perform the requested command. 

Điều này xảy ra sau khi tôi gửi một yêu cầu web từ ứng dụng chính của tôi vào một thứ. Để làm được điều đó, tôi phải đưa ra yêu cầu mạo danh người dùng thực tế và không phải là danh tính mà ứng dụng sử dụng cho mạo danh. Đây thực sự là một câu hỏi SO tôi đã đăng và đã trả lời. Đó là ở đây: How do I call an MVC Action via a WebRequest and validate the request through Active Directory?

Vào cuối của mã đó, tôi gọi:

impersonationContext.Undo(); 

Đó là sau khi yêu cầu web này diễn ra, rằng việc áp dụng chính cố gắng truy cập vào cơ sở dữ liệu và bây giờ có vẻ như các cuộc gọi trên đã hoàn tác việc mạo danh ứng dụng, do đó, nỗ lực của người dùng để làm bất cứ điều gì mở kết nối cơ sở dữ liệu không thành công. Ít nhất, đó là lý thuyết làm việc của tôi sau một ngày bashing đầu.

Câu hỏi của tôi là, làm cách nào để tôi có thể mạo danh ứng dụng để hoàn nguyên về người dùng trong web.config? Hoặc, khi đưa ra yêu cầu web của tôi, có cách nào để đảm bảo bối cảnh mạo danh chỉ áp dụng cho yêu cầu đó không?

Toàn bộ điểm của tất cả điều này là ứng dụng thứ hai có cơ sở dữ liệu máy chủ sql riêng của mình. Ứng dụng chính sử dụng DB2. Tôi muốn viết mã truy cập cơ sở dữ liệu một lần, nhưng sử dụng nó trong cả hai ứng dụng. Hiện tại, đó là những gì tôi đã làm, nhưng phương pháp dựa vào yêu cầu web để lấy dữ liệu có thể không phải là cách tiếp cận tốt nhất.

Tôi cởi mở với bất kỳ suy nghĩ, nhận xét, đề xuất và/hoặc phê bình nào. Làm thế nào tôi nên đi về xử lý này?

+0

Có điều gì tôi cần làm rõ không? Có phải cách câu hỏi được diễn đạt theo cách không? Phản hồi được hoan nghênh. Tôi không nhớ rephrasing hoặc làm rõ nếu có thể. – jason

Trả lời

1

Được rồi ... lý thuyết của tôi rằng ngữ cảnh IPrincipal đã được thay đổi khi thực hiện yêu cầu web được chứng minh là chính xác, điều này làm cho bản sửa lỗi này trở nên cực kỳ dễ dàng. Phần tốt nhất là, tôi có thể tiếp tục sử dụng api tôi xây dựng để thực hiện yêu cầu này mà không cần nhân đôi các bộ phận khung thực thi Sql Server Entity.

Tôi có cuộc gọi sau đây vào thư viện api của tôi:

  proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
       adUserInfo.AssociateId, 
       context.User); 

Mã này đã được gọi bằng một thuộc tính lọc cho phép. Nguyên mẫu phương pháp trông giống như

public void OnAuthorization(AuthorizationContext filterContext)  

Bên trong, các cuộc gọi làm cho GetProxies gọi phương thức sau đây:

 public static StreamReader GetWebRequestStream(
      string url, 
      string contentType, 
      bool useDefaultCredentials, 
      IPrincipal user) 
     { 

      var impersonationContext = ((WindowsIdentity)user.Identity).Impersonate();    
      var request = WebRequest.Create(url); 

      try 
      { 
       request.ContentType = contentType; 
       //request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
       //request.UseDefaultCredentials = useDefaultCredentials;    
       //IWebProxy p = new WebProxy(); 
       //request.Proxy = p. 
       request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; 
       request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
       var response = (HttpWebResponse)request.GetResponse(); 
       return new StreamReader(response.GetResponseStream()); 
      } 
      catch (Exception e) 
      { 
       impersonationContext.Undo(); 
       throw e; 
      } 
      finally 
      { 
       impersonationContext.Undo(); 
      } 

     } 

Khi trở về phương pháp gọi điện thoại, danh tính của người sử dụng không còn là của một bộ cho áp dụng cho mạo danh. Bản sửa lỗi khá đơn giản:

  //Track current identity before proxy call 
      IPrincipal user = context.User; 
      proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
       adUserInfo.AssociateId, 
       context.User); 

      //Undo any impersonating done in the GetProxies call 
      context.User = user;  

2 dòng mã đã giải quyết 12 giờ đau đầu. Nó có thể trở nên tồi tệ. Nhưng dù sao đi nữa. Cảm ơn bạn đã là một hội đồng âm thanh. Tôi đã thử có chuyển đổi này với con vịt, nhưng con vịt đã bối rối.

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