我正在尝试设置一个可在我们公司内部网上运行的WebAPI Web服务和网站。我正在使用IIS来托管web服务(A)以及我的网站(B)。我网站上的一个页面就这样向Web服务发出请求:
var URL = 'http://MachineName:80/AWebService/api/GetGuid';
var request = new XMLHttpRequest();
request.open("GET", URL, false);
request.withCredentials = "true";
request.send();
var response = request.responseText;
return response;
WebService代码如下所示:
[EnableCors(origins: "http://localhost", headers: "*", methods: "*")]
public class StoneSoupController : ApiController
{
[ActionName("GetGuid")]
public HttpResponseMessage GetGuid()
{
var indenty = this.User.Identity;
Guid g = Guid.NewGuid();
HttpResponseMessage msg = new HttpResponseMessage();
msg.Content = new StringContent(g.ToString());
msg.Headers.Add("Access-Control-Allow-Origin", "http://localhost"); //tried with and without this
msg.Headers.Add("Access-Control-Allow-Credentials", "true"); //tried with and without this
return msg;
}
}
如果我将IIS中的身份验证模式设置为匿名身份验证,则Web服务会按预期返回guid字符串。但是,我需要控制哪些用户能够访问Web服务上的某些方法,并希望使用他们的Windows凭据来执行此操作。
我的问题是我似乎无法让Firefox发送Windows凭据。我尝试在http://localhost
中将network.automatic-ntlm-auth.trusted-uris
包含在about-config
的Firefox中,但这似乎没有任何效果。
我在IIS中启用了日志记录,这是它为请求记录的内容
2013-08-01 21:36:05 136.203.40.232 GET /AWebService/api/GetGuid - 80 - 136.203.40.232 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:17.0)+Gecko/20100101+Firefox/17.0 200 0 0 965
正如您所看到的,交易中没有用户ID。
任何人都可以帮我吗?
答案 0 :(得分:1)
浏览器会在响应标头
时询问或自动发送用户凭据WWW-Authenticate NTLM
第2步:
您需要将Web api的身份验证更改为Windows,并将authorize属性添加到操作或控制器
第3步: Firefox不会像IE发送一样发送凭据。你需要改变firefox设置 about:config中 将应用程序URL设置为此变量network.automatic-ntlm-auth.trusted-uris
答案 1 :(得分:0)
关于你对Giridhar的评论:
可能是IIS没有启用“HTTP keep-alive”。
启用HTTP Keep-Alives
在IIS管理器中,展开本地计算机,展开“网站”文件夹,右键单击该网站,然后单击“属性”。
在“网站”选项卡上的“连接”部分中,单击“启用HTTP保持活动”复选框。
- 醇>
单击“应用”,然后单击“确定”。
(来自Microsoft)