我在此处指定了用户和密码http://jaydata.org/blog/jaydata-1.0.5-is-here-with-authentication-support-and-more但我一直在领401。有什么想法吗?
你能用fiddler或wireshark捕获流量吗?基本身份验证确实有效。。。。
我也有同样的问题。我关注了这篇博客文章(http://jaydata.org/blog/jaydata-1.0.5-is-here-with-authentication-support-and-more)并将basisc-auth的凭证应用于上下文初始化。
var ctx = new NutritionDataService.NutritionDbEntities({
name: 'oData',
oDataServiceHost: 'https://localhost:44300/Data.svc',
user: "usr1",
password: "test"
});
但似乎没有设置授权标头。
https://i.stack.imgur.com/F228l.png
我在这篇文章中也尝试过这种方法。jaydata基本身份验证的问题得到了相同的结果——没有发送授权头。
有人知道如何触发jaydata发送授权头吗?
好的,
我找到了解决上述问题的方法。问题是服务器端使用CORS的配置错误。在记录的请求中(请参阅https://i.stack.imgur.com/F228l.png)Chrome发送一个"preflighted request"(HTTP请求的方法为OPTIONS)。
与简单请求(如上所述)不同,"preflighted"请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests
我没有在服务器上验证HTTP属性"method",所以我的BasicAuth模块启动了每个传入HTTP请求的授权过程,但由于没有设置授权标头,因此无法立即执行第一个请求("preflight请求")。
在修改了HTTP方法的验证后,一切正常。
我还必须调整web.conf
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="BasicAuthModule" type="NutritionDataService.Auth.BasicAuthModule"/>
</modules>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Max-Age" value="3600" />
<add name="Access-Control-Allow-Headers" value="Origin, Content-Type, Accept, MaxDataServiceVersion, Authorization, Access-Control-Allow-Origin, DataServiceVersion" />
<add name="Access-Control-Allow-Methods" value="PUT, POST, GET, DELETE, MERGE, OPTIONS" />
</customHeaders>
</httpProtocol>
访问控制允许标头必须获得每个请求的标头,否则您将得到501响应。(在上面的屏幕截图中,它是"accept,maxdataserviceversion.dataserviceversion,authorization")