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