2013-09-25 37 views
37

我一直在使用DotNetOpenAuth很多。首先,我們使用5.0.0-alpha1,但我們切換到v4.0.30319,因爲我們無法找到導致我們問題的原因。DotNetOpenAuth不適用於MVC 5 RC

我們正在Visual Studio 2013中使用MVC 5 RC在.NET 4.5.1 RC上構建C#Web API項目。我們已實施IAuthorizationServerHostINonceStoreICryptoKeyStore

是我們的問題是圍繞着以下情況:

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();一個在DotNetOpenAuth.Messaging起源和MessagingUtilities靜態類方法。 DotNetOpenAuth.Core(包含此代碼)引用MVC 4.0,而HttpResponseMessageActionResult類繼承自ActionResult

這意味着DotNetOpenAuth的當前版本與MVC 5不兼容。編譯並嘗試運行此操作只會出現500個錯誤。

有沒有人有任何想法如何可以很容易地修復(或可能不)?

我沒有注意到DotNetOpenAuth Nuget包在我的包上寫了5.0。因此,重新安裝包,再加入assemblyBinding後:

<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> 

這讓我們遠一點。現在的錯誤歸結爲:

嘗試通過安全透明的方法「DotNetOpenAuth.Messaging.MessagingUtilities.AsActionResult(DotNetOpenAuth.Messaging.OutgoingWebResponse)」訪問安全關鍵型「System.Web.Mvc.ActionResult失敗。

回答

6

經過進一步調試和談話的人DotNetOpenAuth在GitHub上https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/307的結論是,MVC 5有一個新的安全模式。

綁定重定向將因此不夠。直到進一步有兩種選擇:

1)抓住DotNetOpenAuth源代碼,並從所有項目中刪除[assembly:AllowPartiallyTrustedCallers]。重新編譯和成員禁用強名稱驗證sn -Vr *。此代碼無法在中等信任環境中運行。

2)抓鬥的DotNetOpenAuth源代碼並重新編譯它針對MVC 5.

根據未來的最佳解決方案將所有相關的MVC東西移出到一個單獨的組件在GitHub的討論。

+0

我剛剛升級到MVC5並崩潰到這個問題。環顧四周,我驚訝地發現AA已經放棄了這個項目。由於很長一段時間沒有釋放,我無法確定DNOA是否正在積極開發。項目的狀態如何?你還在使用DNOA嗎? – Jammer

3

一種解決方法(可與目前的測試NuGet包使用),用於這種情況下:

  • 創建的ActionResult類包裝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(); 
         } 
        } 
    } 
    
  • 變化return outgoingWebResponse.AsActionResult();new WrapperHttpResponseMessageResult(outgoingWebResponse);

代碼WrapperHttpResponseMessageResult複製自AsActionResult,所以它們執行相同的功能。

50

修復可用。

安裝NuGet包DotNetOpenAuth.Mvc5和改變AsActionResult()所有使用到AsActionResultMvc5()

+2

有沒有辦法在* unified *包中使用它?或者我們需要刪除它並分別添加所有單獨的組件? –

+3

已經使用DotNetOpenAuth.Ultimate軟件包時存在衝突。 –

+0

使用DotNetOpenAuth.Ultimate軟件包。我仍然遇到這個錯誤。更新中有任何更改? – MoXplod

2

使用這個以確保授權人被正確地傳遞。

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

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

'然後正確如果具有OutgoingWebresponse使用它檢索

​​
0

(沒有升級dotnetOpenAuth但MVC是5個)。

加入這個類(從langtu的迴應黑客攻擊):

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(); 
     } 
    } 
} 

,然後替換:

回報response.AsActionResult();

返回新WrapperHttpResponseMessageResult(響應);

+0

最簡單和最乾淨的是安裝DotNetOpenAuth.Mvc5 nuget包,如Andrew Arnott所述。 – decocijo

相關問題