Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DotNetOpenAuth不使用MVC 5 RC_C#_Asp.net_Asp.net Mvc_Oauth 2.0_Dotnetopenauth - Fatal编程技术网

C# DotNetOpenAuth不使用MVC 5 RC

C# DotNetOpenAuth不使用MVC 5 RC,c#,asp.net,asp.net-mvc,oauth-2.0,dotnetopenauth,C#,Asp.net,Asp.net Mvc,Oauth 2.0,Dotnetopenauth,我一直在与DotNetOpenAuth合作。首先,我们使用了5.0.0-alpha1,但我们切换到了v4.0.30319,因为我们找不到导致问题的原因 我们正在Visual Studio 2013中使用MVC5RC在.NET 4.5.1 RC上构建一个C#Web API项目。我们已经实现了IAuthorizationServerHost、INonceStore和ICryptoKeyStore 我们遇到的问题是以下情况: public class TokensController : Contro

我一直在与DotNetOpenAuth合作。首先,我们使用了5.0.0-alpha1,但我们切换到了v4.0.30319,因为我们找不到导致问题的原因

我们正在Visual Studio 2013中使用MVC5RC在.NET 4.5.1 RC上构建一个C#Web API项目。我们已经实现了
IAuthorizationServerHost
INonceStore
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();
    }
}
这让我们走得更远了。现在,错误归结为:

安全透明方法“DotNetOpenAuth.Messaging.MessagingUtilities.AsActionResult(DotNetOpenAuth.Messaging.OutgoingWebResponse)”尝试访问安全关键类型“System.Web.Mvc.ActionResult”失败


在进一步调试并与GitHub的DotNetOpenAuth人员交谈后,得出的结论是MVC5有了一个新的安全模型

因此,绑定重定向是不够的。在此之前,有两种选择:

1) 获取DotNetOpenAuth源代码并从所有项目中删除[assembly:AllowPartiallyTrustedCallers]。重新编译和成员以禁用强名称验证序列号-Vr*。在此之后,代码不能在中等信任环境中运行

2) 获取DotNetOpenAuth源代码并根据MVC5重新编译它

根据GitHub上的讨论,未来最好的解决方案是将所有相关的MVC内容转移到一个单独的组件中。

对于这种情况,一个解决方法(可以与当前的beta 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();
            }
        }
    }
    
    公共类包装器HttpResponseMessageResult:ActionResult
    {
    专用只读HttpResponseMessage\u响应;
    公共包装器HttpResponseMessageResult(HttpResponseMessageResponse)
    {
    _响应=响应;
    }
    公共覆盖无效ExecuteSult(ControllerContext上下文)
    {
    HttpResponseBase responseContext=context.RequestContext.HttpContext.Response;
    responseContext.StatusCode=(int)\u response.StatusCode;
    responseContext.StatusDescription=\u response.reasonPhase;
    foreach(KeyValuePair-KeyValuePair-in(HttpHeaders)\u response.Headers)
    {
    foreach(keyValuePair.Value中的字符串str)
    AddHeader(keyValuePair.Key,str);
    }
    如果(_response.Content!=null)
    {
    _response.Content.CopyToAsync(responseContext.OutputStream.Wait();
    }
    }
    }
    
  • 更改
    返回outgoingWebResponse.AsActionResult()
    新包装器HttpResponseMessageResult(outgoingWebResponse)

WrapperHttpResponseMessageResult的代码是从AsActionResult复制的,因此它们执行相同的功能。

修复可用


安装NuGet软件包DotNetOpenAuth.Mvc5,并将
AsActionResult()
的所有用法更改为
AsActionResultMvc5()

使用此选项可确保正确传递授权人

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

    public new ActionResult BeginAuthorization(Uri callback)
    {
        this.Callback = callback;
        return new MvcOAuthActionResult(this);
    }
}
'然后正确地检索它

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

如果将其与OutgoingWebresponse一起使用(未将dotnetOpenAuth升级,但将mvc yes升级为5)

添加此类(从的响应中黑客攻击):

然后替换:

返回response.AsActionResult()


返回新的WrapperHttpResponseMessageResult(响应)

有没有一种方法可以在统一包中使用它?或者我们需要删除它并分别添加回所有单独的组件吗?当已经使用DotNetOpenAuth.Ultimate包。使用DotNetOpenAuth.Ultimate包时存在冲突。我仍在犯那个错误。更新有什么变化吗?我刚升级到MVC5,突然遇到了这个问题。环顾四周,我惊奇地发现AA已经放弃了这个项目。我真的说不出DNOA仍在积极开发中,因为已经很长时间没有发布了。项目的状态如何?您还在使用DNOA吗?最简单、最干净的方法是安装下面提到的DotNetOpenAuth.Mvc5 nuget包。
 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();
        }
    }
}