2013-09-25 118 views
37

Tôi đã làm việc rất nhiều với DotNetOpenAuth. Đầu tiên chúng tôi sử dụng 5.0.0-alpha1 nhưng chúng tôi chuyển sang v4.0.30319 vì chúng tôi không thể tìm thấy nguyên nhân gây ra sự cố.DotNetOpenAuth không hoạt động với MVC 5 RC

Chúng tôi đang xây dựng dự án C# Web API trên .NET 4.5.1 RC với MVC 5 RC trong Visual Studio 2013. Chúng tôi đã triển khai IAuthorizationServerHost, INonceStoreICryptoKeyStore.

Vấn đề mà chúng tôi có được xung quanh trường hợp sau đây:

public class TokensController : Controller 
{ 
    private readonly AuthorizationServer authorizationServer = new AuthorizationServer(new MyAuthorizationServer()); 

    /// <summary> 
    /// This action will handle all token requests. 
    /// </summary> 
    /// <returns>The action result that will output the token response.</returns> 
    [HttpPost] 
    public ActionResult Index() 
    { 
     var outgoingWebResponse = this.authorizationServer.HandleTokenRequest(this.Request); 
     return outgoingWebResponse.AsActionResult(); 
    } 
} 

return outgoingWebResponse.AsActionResult(); một phương pháp có nguồn gốc trong DotNetOpenAuth.Messaging và lớp tĩnh MessagingUtilities. Tài liệu tham khảo DotNetOpenAuth.Core (có chứa mã này) tham chiếu MVC 4.0 và lớp HttpResponseMessageActionResult được kế thừa từ ActionResult.

Điều này có nghĩa là phiên bản hiện tại của DotNetOpenAuth không tương thích với MVC 5. Biên dịch và cố gắng chạy điều này sẽ chỉ xảy ra trường hợp 500 lỗi.

Có ai có bất kỳ ý tưởng nào về việc điều này có thể dễ dàng được sửa chữa không (hoặc có thể không)?

Tôi đã không nhận thấy gói DotNetOpenAuth Nuget đã viết trên các gói của tôi cho 5.0. Vì vậy, sau khi cài đặt lại các gói và thêm assemblyBinding một lần nữa:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="5.0.0.0" /> 
    </dependentAssembly> 
</assemblyBinding> 

Điều này đã cho chúng tôi thêm một chút. Bây giờ lỗi đi xuống đến:

Nỗ lực của an ninh phương pháp minh bạch 'DotNetOpenAuth.Messaging.MessagingUtilities.AsActionResult (DotNetOpenAuth.Messaging.OutgoingWebResponse)' để truy cập an ninh loại quan trọng 'System.Web.Mvc.ActionResult' thất bại.

Trả lời

6

Sau khi tiếp tục gỡ lỗi và nói chuyện với mọi người tại DotNetOpenAuth tại GitHub https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/307 kết luận là MVC 5 có mô hình bảo mật mới.

Chuyển hướng ràng buộc do đó sẽ không đủ. Cho đến khi có thêm hai lựa chọn:

1) Lấy mã nguồn DotNetOpenAuth và xóa [assembly: AllowPartiallyTrustedCallers] khỏi tất cả các dự án. Biên dịch lại và thành viên để vô hiệu hóa xác minh tên mạnh sn -Vr *. Sau khi mã này không thể chạy trên môi trường tin cậy trung bình.

2) Lấy mã nguồn DotNetOpenAuth và biên dịch lại nó chống lại MVC 5.

Theo các cuộc thảo luận trên GitHub giải pháp tốt nhất trong tương lai sẽ được di chuyển ra tất cả những thứ MVC liên quan đến một hội đồng riêng biệt.

+0

Tôi vừa mới nâng cấp lên MVC5 và gặp sự cố này. Nhìn xung quanh tôi đã rất ngạc nhiên khi biết rằng AA đã từ bỏ dự án. Tôi thực sự không thể nói DNOA vẫn đang được phát triển tích cực vì chưa có bản phát hành trong một thời gian dài. Trạng thái của dự án là gì? Bạn vẫn đang sử dụng DNOA? – Jammer

3

Một cách giải quyết (có thể sử dụng với gói beta NuGet hiện hành) đối với trường hợp này:

  • Tạo một lớp ActionResult kết thúc tốt đẹp HttpResponseMessage

    public class WrapperHttpResponseMessageResult : ActionResult 
    { 
        private readonly HttpResponseMessage _response; 
    
        public WrapperHttpResponseMessageResult(HttpResponseMessage response) 
        { 
         _response = response; 
        } 
    
        public override void ExecuteResult(ControllerContext context) 
        { 
         HttpResponseBase responseContext = context.RequestContext.HttpContext.Response; 
         responseContext.StatusCode = (int)_response.StatusCode; 
         responseContext.StatusDescription = _response.ReasonPhrase; 
         foreach (KeyValuePair<string, IEnumerable<string>> keyValuePair in (HttpHeaders)_response.Headers) 
         { 
          foreach (string str in keyValuePair.Value) 
           responseContext.AddHeader(keyValuePair.Key, str); 
         } 
    
         if (_response.Content != null) 
         { 
          _response.Content.CopyToAsync(responseContext.OutputStream).Wait(); 
         } 
        } 
    } 
    
  • Thay đổi return outgoingWebResponse.AsActionResult(); để new WrapperHttpResponseMessageResult(outgoingWebResponse);

Mã số của WrapperHttpResponseMessageResult được sao chép từ AsActionResult, vì vậy chúng thực hiện cùng chức năng.

50

Khắc phục sự cố.

Install NuGet gói DotNetOpenAuth.Mvc5 và thay đổi tất cả công dụng của AsActionResult()-AsActionResultMvc5()

+2

Có cách nào để sử dụng với gói * thống nhất * không? hoặc chúng ta cần phải loại bỏ điều đó và thêm lại tất cả các thành phần riêng lẻ? –

+3

Có xung đột khi đã sử dụng gói DotNetOpenAuth.Ultimate. –

+0

Sử dụng gói DotNetOpenAuth.Ultimate. Tôi vẫn nhận được lỗi đó. Bất cứ điều gì thay đổi trong các bản cập nhật? – MoXplod

2

này sử dụng để đảm bảo rằng bên ủy quyền được thông qua một cách chính xác.

public class MvcAuthorizer : WebAuthorizer 
{ 
    public ActionResult BeginAuthorization() 
    { 
     return new MvcOAuthActionResult(this); 
    } 

    public new ActionResult BeginAuthorization(Uri callback) 
    { 
     this.Callback = callback; 
     return new MvcOAuthActionResult(this); 
    } 
} 

'sau đó lấy nó một cách chính xác

public class MvcOAuthActionResult : ActionResult 
{ 
    private readonly WebAuthorizer webAuth; 

    public MvcOAuthActionResult(WebAuthorizer webAuth) 
    { 
     this.webAuth = webAuth; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     webAuth.PerformRedirect = authUrl => 
     { 
      HttpContext.Current.Response.Redirect(authUrl); 
     }; 

     Uri callback = 
      webAuth.Callback == null ? 
       HttpContext.Current.Request.Url : 
       webAuth.Callback; 

     webAuth.BeginAuthorization(callback); 
    } 
} 
0

Nếu sử dụng nó với OutgoingWebresponse (không nâng cấp dotnetOpenAuth nhưng có MVC đến 5).

Thêm lớp này (bị hack từ phản ứng langtu 's):

public class WrapperHttpResponseMessageResult : ActionResult 
{ 
    private readonly OutgoingWebResponse _response; 

    public WrapperHttpResponseMessageResult(OutgoingWebResponse response) 
    { 
     _response = response; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     HttpResponseBase responseContext = context.RequestContext.HttpContext.Response; 
     responseContext.StatusCode = (int)_response.Status; 
     responseContext.StatusDescription = _response.Status.ToString(); 
     foreach (string key in _response.Headers.Keys) 
     { 
      responseContext.AddHeader(key, _response.Headers[key]); 
     } 

     if (_response.Body != null) 
     { 
      StreamWriter escritor = new StreamWriter(responseContext.OutputStream); 
      escritor.WriteAsync(_response.Body).Wait(); 
     } 
    } 
} 

Và sau đó thay thế:

trở response.AsActionResult();

với

trả về trình bao bọc mớiHttpResponseMessageResult (phản hồi);

+0

Cách dễ nhất và đơn giản nhất là cài đặt gói nuget DotNetOpenAuth.Mvc5 như Andrew Arnott được đề cập dưới đây. – decocijo