尝试从WebApi获取数据。这是TypeScript中的服务调用:
GetStatus(hostName: string): any {
this.Http.post(this.ServiceBaseAddress)
.success(data => {
return data;
});
}
在服务器端,我已完成以下操作以启用CORS:
1:添加NugetPackage Microsoft.ASP.Net.Cors
2:将EnableCors属性添加到一个Controller(我正在尝试调用)
[EnableCors("*", "*", "*")]
public class DeployController : ApiController
{ //...
}
3:在WebApiConfig中启用CORS
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors(); //...
4:通过Web.config(在system.webServer区域中)添加自定义标头
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</customHeaders>
</httpProtocol>
我注意到Fiddler似乎做了一些非常讨厌的缓存,这让我困惑了不止一次......现在,至少,我收到的回复有以下标题:
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?QzpcRGV2ZWxvcFxTUEFSQ1xEZXZlbG9wXFJ1bnRpbWVcU1BBUkMuTWFuYWdlbWVudEFwaVxNYW5hZ2VtZW50QXBpXGFwaVxkZXBsb3lcZ2V0aG9zdHM=?=
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Date: Mon, 30 Nov 2015 13:12:48 GMT
Content-Length: 6540
Proxy-Support: Session-Based-Authentication
响应的内容是服务的401错误站点。
为了实现这一点,我尝试向WebApis Web.config添加匿名身份验证,但没有成功:
<authorization>
<allow users="*"/>
</authorization>
任何想法我能做什么?我如何进行身份验证?
修改 事实证明这确实是一个身份验证问题。 WebApi身份验证设置如下:
<authentication mode="Windows" />
话虽如此,我需要知道如何告诉角度Ajax调用使用我的凭据。
答案 0 :(得分:1)
HTTP / 1.1 401未经授权
可能的情况
401
。 .aspxauth
或Basic Auth这样的Cookie)答案 1 :(得分:1)
我遇到了同样的问题,您应该添加SupportsCredentials
选项。
在 asp.net 4
中configuration.EnableCors(new EnableCorsAttribute("https://mysite.mydomain.com", "*", "*")
{
SupportsCredentials = true
});
它在 asp.net 5
中的样子private static void ConfigureCors(IServiceCollection services)
{
services.AddCors();
var policy = new CorsPolicy();
policy.Headers.Add("*");
policy.Methods.Add("*");
policy.Origins.Add("*");
policy.SupportsCredentials = true;
services.ConfigureCors(x => x.AddPolicy(DefaultCorsPolicy, policy));
}
答案 2 :(得分:0)
通过这里给出的所有答案加上一些研究,我发现了该怎么做 - 首先,我必须修改角度ajax调用以传递我的凭据,如下所示:
this.Http.get(this.ServiceBaseAddress + addressPart, { withCredentials: true });
然后,如@michalczukm所示,我必须将服务配置为接受这些凭据。
作为清理工作,我将所有与Cross-Origin相关的内容移至web.config
并删除了属性
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:59664" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
</customHeaders>
</httpProtocol>