C# DotNetOpenAuth不使用MVC 5 RC
我一直在与DotNetOpenAuth合作。首先,我们使用了5.0.0-alpha1,但我们切换到了v4.0.30319,因为我们找不到导致问题的原因 我们正在Visual Studio 2013中使用MVC5RC在.NET 4.5.1 RC上构建一个C#Web API项目。我们已经实现了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
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();
}
}
}