1

我有一个简单的(仅用于故障排除)实现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 类。

4

1 回答 1

1

结果是在可以写入“Access-Control-Allow-Origin”标头之前发生了异常。单步执行代码并没有发现异常。但是,一旦我按照@Robert Levy 的建议使用了提琴手,我就看到了包含异常的完整响应 - “无法加载文件或程序集'System.Web.Helpers'”。我将问题追踪到 web.config,其中dependentAssembly条目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但程序集的版本是2.0.0.0. 在 web.config 中进行此更改解决了该问题。

于 2014-10-03T02:54:21.587 回答