如何解决从控制器调用托管在同一服务器上的Web API,auth的AD名称是IIS应用程序池名称,而不是用户名
应用说明
该应用程序包含两个功能。在控制器内是对Web API的调用,如下所示:
private async Task<string> CallMciPostsApi()
{
using (var handler = new httpclienthandler { UseDefaultCredentials = true })
using (var client = new HttpClient(handler))
{
var response = await
client.GetAsync("https://medapp10.med.state.sbu/emed2webapi/api/mcipost");
if (response.IsSuccessstatusCode)
{
return await response.Content.ReadAsstringAsync();
}
else
{
EventLogger.Info(response.ReasonPhrase);
}
}
return null;
}
控制器具有 [Authorize(Roles = ("MED Supervisors Overseas"))]
function getCountries() {
var xhr = new XMLHttpRequest();
xhr.open('GET','https://medapp10.med.state.sbu/Emed2webapi/api/mcipost');
xhr.setRequestHeader('Content-Type','application/json');
xhr.onload = function () {
loadCountrySelect(JSON.parse(xhr.responseText),true);
}
xhr.send();
}
web.config
<authorization>
<allow users="*" />
<deny users="?" />
</authorization>
<identity impersonate="false" />
Web API
[Authorize(Roles = ("MED Supervisors Overseas"))]
[RoutePrefix("api/mcipost")]
public class MciPostController : BaseController
{
/// <summary>
/// Status Return a list of MciPost objects
/// </summary>
/// <returns></returns>
[Route()]
[HttpGet]
public virtual IHttpActionResult Get()
{
try
{
var entityList = MCIPostRepository.Get();
if (entityList == null)
{
return InternalServerError(); // 500 Internal Server Error
}
if (entityList.Count == 0)
{
return NotFound();
}
return Ok(entityList); // 200 OK
}
catch (Exception ex)
{
EventLogger.Error(ex);
}
}
}
问题
-
已安装Web API并在Visual下运行应用程序 Studio-IIS Express,AJAX调用失败,但控制器调用 成功。 Visual Studio以本地管理员身份运行 基于运行生成后脚本且无法查看网络资源的问题,VS以管理员身份运行这一事实可能很重要。 em>
-
但是,在Web API主机服务器上安装了应用程序的情况下, 相反的情况发生,AJAX调用成功,控制器 呼叫失败(response.ReasonPhrase =“未授权”)。
经过几天的研究和与同事协商,为什么如此仍然是一个谜。这是我第一次处理Active Directory,我怀疑对于广泛使用它的人来说,我缺少明显的东西。
关于问题2,创建了一个自定义授权属性来记录授权错误。活动目录名称是“ IIS APPPOOL”名称。
- 尝试在web.config中设置impersonate =“ true”
该如何解决?**
解决方法
来自: Web api authorization by capturing client's service account name
将 HttpClient 更改为 WebClient (UseDefaultCredentials=true;) 并在 web.config 上设置 impersonate=true。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。