我有一个简单的(仅用于故障排除)OAuthAuthorizationServerProvider
的实现,我在这里覆盖GrantResourceOwnerCredentials
方法:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
context.SetError("invalid_grant", "The user name or password is incorrect.");
}
第一行启用CORS,第二行只是使上下文无效。使用Chrome进行测试时,这可以正常工作 - 当我向令牌端点发送POST时,我返回 400(错误请求)。
但是,当我引入System.Web.Helpers.Crypto
的任何引用时,CORS不再有效,我回来了请求的资源上没有'Access-Control-Allow-Origin'标头。例如,如果我将上述内容更改为:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var salt = System.Web.Helpers.Crypto.GenerateSalt();
context.SetError("invalid_grant", "The user name or password is incorrect.");
}
这当然是我在解决问题时提出的一个人为的例子。在实际的GrantResourceOwnerCredentials中,使用Crypto.VerifyHashedPassword()导致完全相同的问题。另外,作为测试,我在另一个课程中快速将调用包装到Crypto,但问题仍然存在。
我遇到过一个奇怪的错误吗?任何方向都将受到赞赏。
更新:进一步调查显示,任何对System.Web.Helpers的引用都会出现此问题。换句话说,它不是特定于System.Web.Helpers.Crypto类。
答案 0 :(得分:1)
在可以写入“Access-Control-Allow-Origin”标头之前发生异常。单步执行代码并未显示异常。但是,一旦我使用了fiddler,正如@Robert Levy所推荐的那样,我看到了包含异常的完整响应 - “无法加载文件或程序集'System.Web.Helpers'”。我将问题跟踪到web.config,其中dependentAssembly
的{{1}}条目的版本号错误:
System.Web.Helpers
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
设置为newVersion
,但程序集的版本为3.0.0.0
。在web.config中进行此更改解决了问题。