我有一个需要与服务通信的AngularJS应用程序。该服务未设置为接收CORS请求,因此我有一个ASP.NET WebAPI代理,它接收来自AngularJS应用程序的请求,然后调用该服务。
使用Windows身份验证。凭据传递方式如下:
$http({
method: 'POST',
url: 'api/Query/',
data: data,
withCredentials: true
})
.success(function (response) {
args.success(response);
})
.error(function (data, status, headers, config) {
args.error(data.Message);
});
然后,WebAPI服务模拟主体,调用服务并返回数据:
[Authorize]
public class QueryController : ApiController
{
[Log]
[HttpPost]
public HttpResponseMessage Post([FromBody]object data)
{
var url= ConfigurationManager.AppSettings["URL"];
var windowsIdentity = (WindowsIdentity)HttpContext.Current.User.Identity;
using (windowsIdentity.Impersonate())
{
var searializedData = JsonConvert.SerializeObject(data);
using (var client = new WebClient { UseDefaultCredentials = true })
{
client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
var responseBytes = client.UploadData(url, "POST", Encoding.UTF8.GetBytes(searializedData));
return new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new ByteArrayContent(responseBytes)
};
}
}
}
}
终端服务对我来说有点黑盒子 - 我不完全了解并无法控制那里发生的事情。
现在,当我从IE拨打电话时,它会成功通话。当我从Chrome拨打电话时,它成功调用了WebAPI,但是在WebAPI中,当它到达client.Upload(...)行时,终端服务会响应401 Unauthorized响应。
如果我在通话中设置断点并在IE或Chrome通话中检查windowsIdentity,则会设置IsAuthenticated标志,AuthenticationType为' Negotiate'并且身份名称是我的登录名,完全符合预期。
有一点不同的是索赔,尤其是群组。进行Chrome通话时,会包含以下群组:
S-1-5-1139721481-3647981065-3646938227-513
S-1-1-0
S-1-5-32-545
S-1-5-2
S-1-5-11
S-1-5-15
当我进行IE调用时,会提供以下内容:
S-1-5-1139721481-3647981065-3646938227-513
S-1-1-0
S-1-5-32-545
S-1-5-11
S-1-5-15
S-1-5-4
S-1-2-1
S-1-2-0
事实上,任何成功的电话往往会有最后3个电话,未经授权的电话也不会。这些显然具有以下含义:
SID:S-1-5-4 名称:互动 描述:包含以交互方式登录的所有用户的组。成员资格由操作系统控制。
SID:S-1-2-0 名称:本地 描述:包含已在本地登录的所有用户的组。
SID:S-1-2-1 名称:控制台登录 描述:包含登录到物理控制台的用户的组。
我已尝试过不同的身份验证提供程序,但这并没有什么不同。
这里发生了什么以及如何防止它?