CORS没有';GrantResourceOwnerCredentials引用System.Web.Helpers

本文关键字:引用 System Web Helpers GrantResourceOwnerCredentials 没有 CORS | 更新日期: 2023-09-27 18:25:26

我有一个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类特有的

CORS没有';GrantResourceOwnerCredentials引用System.Web.Helpers

发现在写入"Access Control Allow Origin"标头之前发生了异常。逐步执行代码并没有发现异常。然而,当我按照@Robert Levy的建议使用fiddler时,我看到了包含异常的完整响应-"无法加载文件或程序集"System.Web.Helpers"。我将问题追踪到Web.config,其中System.Web.HelpersdependentAssembly条目的版本号错误:

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