从控制器调用托管在同一服务器上的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"))]

在剃须刀页面中有一个Ajax调用:

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);
        }
    }
}

问题

  1. 已安装Web API并在Visual下运行应用程序 Studio-IIS Express,AJAX调用失败,但控制器调用 成功。 Visual Studio以本地管理员身份运行 基于运行生成后脚本且无法查看网络资源的问题,VS以管理员身份运行这一事实可能很重要。 em>

  2. 但是,在Web API主机服务器上安装了应用程序的情况下, 相反的情况发生,AJAX调用成功,控制器 呼叫失败(response.ReasonPhrase =“未授权”)。

经过几天的研究和与同事协商,为什么如此仍然是一个谜。这是我第一次处理Active Directory,我怀疑对于广泛使用它的人来说,我缺少明显的东西。

关于问题2,创建了一个自定义授权属性来记录授权错误。活动目录名称是“ IIS APPPOOL”名称。

  1. 尝试在web.config中设置impersonate =“ true”

该如何解决?**

解决方法

来自: Web api authorization by capturing client's service account name

将 HttpClient 更改为 WebClient (UseDefaultCredentials=true;) 并在 web.config 上设置 impersonate=true。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...