当GrantResourceOwnerCredentials引用System.Web.Helpers时,CORS不起作用

时间:2014-10-02 20:12:53

标签: c# asp.net asp.net-web-api owin owin-security

我有一个简单的(仅用于故障排除)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'标头。例如,如果我将上述内容更改为:

,CORS将失败
    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类。

1 个答案:

答案 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中进行此更改解决了问题。