38

私は DotNetOpenAuth で多くの作業を行ってきました。最初は 5.0.0-alpha1 を使用していましたが、問題の原因が特定できなかったため、v4.0.30319 に切り替えました。

Visual Studio 2013 で MVC 5 RC を使用して .NET 4.5.1 RC で C# Web API プロジェクトを構築してIAuthorizationServerHostINonceStoreますICryptoKeyStore

私たちが抱えている問題は、次の場合です。

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' へのアクセスに失敗しました。

4

5 に答える 5

6

さらにデバッグし、GitHub https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/307のDotNetOpenAuth の人々と話し合った結果、MVC 5 には新しいセキュリティ モデルがあるという結論に達しました。

したがって、バインディング リダイレクトでは十分ではありません。さらに進むまで、次の 2 つの選択肢があります。

1) DotNetOpenAuth ソース コードを取得し、[アセンブリ: AllowPartiallyTrustedCallers] をすべてのプロジェクトから削除します。厳密な名前の検証を無効にするために再コンパイルしてメンバーを追加する sn -Vr *. このコードの後、中程度の信頼環境では実行できません。

2) DotNetOpenAuth ソース コードを取得し、MVC 5 に対して再コンパイルします。

GitHub での議論によると、今後の最善の解決策は、関連するすべての MVC を別のアセンブリに移動することです。

于 2013-09-26T06:38:04.417 に答える
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ため、同じ機能を実行します。

于 2013-10-01T15:15:56.450 に答える
0

OutgoingWebresponse で使用する場合 (dotnetOpenAuth をアップグレードしませんでしたが、mvc yes を 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(応答) を返します。

于 2014-09-26T18:55:21.563 に答える