为啥我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名?

Posted

技术标签:

【中文标题】为啥我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名?【英文标题】:Why am I not getting my username in the windows authenticated Web Core API?为什么我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名? 【发布时间】:2018-01-17 14:12:57 【问题描述】:

我的 Web Core API 中的这段代码确认我是经过身份验证的用户,但我没有获得我的用户名,而是获得了应用程序池的名称。 我该如何解决这个问题?

var testa = User.Identity.GetType();
NLogger.Info($"testa = testa");
var testd = User.Identity.IsAuthenticated;
NLogger.Info($"testd = testd");
var loggedInUser = User.Identity.Name;
NLogger.Info($"loggedInUser = loggedInUser");

在我的日志文件中,我得到了;

testa = System.Security.Principal.WindowsIdentity
testd = True
loggedInUser = IIS APPPOOL\SIR.WEBUI

我为控制器使用 [Authorize] 标签,匿名身份验证被禁用。

好吧,我从 Postman 调用该方法,它工作正常,LoggedInUser 是正确的。但是当我从我的代码中调用时,我得到了上面显示的不正确的 loggedInUser。 我用来从客户端应用调用 Web api 的代码是;

public static async Task<IEnumerable<ContractDto>> GetAllForUser()

    using (var client = new HttpClient(new HttpClientHandler  UseDefaultCredentials = true ))
    
        client.BaseAddress = new Uri(AppSettings.ServerPathApi);
        var path = GetPath("getallforuser");
        var response = await client.GetAsync(path);
        response.EnsureSuccessStatusCode();
        var stringResult = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<IEnumerable<ContractDto>>(stringResult);
    

在 IIS 中,我已将应用程序池类型设置为所有各种选项; applicationpoolidentity、networkservice、localservice、localsystem 并每次测试应用程序。我到底错过了什么?

【问题讨论】:

在这里接受类似问题的答案***.com/a/12675503/5233410 我不确定这是否是问题所在,但我建议您尝试在 IIS 中将“加载用户配置文件”设置为 true(如果尚未设置) @Nkosi,试过了,但它不起作用。我正在使用 Web Core API,我认为模拟的工作方式不同。也许我应该使用模拟?但是我在使用 AJAX 时不需要这样做,那为什么 C# 会有什么不同呢? 你试过userName = HttpContext.Current.User.Identity.Name; 【参考方案1】:

试试这个

if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)

  string username = System.Web.HttpContext.Current.User.Identity.Name;

或者你可以试试

var user = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity;
var userName = user.Impersonate();

【讨论】:

做了一些研究后,我发现来自 AJAX 的调用会从浏览器获取我的身份,但通过 IIS 它将获取应用程序池。 IIS 的解决方案是使用模拟,我现在正在研究。 @arame3333 如果要添加模拟,请使用第二个代码,但添加此部分 var userName = user.Impersonate()。我已经编辑了答案以包含它 @arame3333 你可以检查这个链接这里有一个类似的问题Get Credentials with Request 必须在发出请求之前在调用代码中设置模拟,以便代码可以在 Web Core API 中工作。我需要弄清楚如何做到这一点。

以上是关于为啥我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名?的主要内容,如果未能解决你的问题,请参考以下文章

我如何通过 .net 远程调用模拟经过 Windows 身份验证的 Web 用户?

为啥经过身份验证的 CORS 请求的预检 OPTIONS 请求在 Chrome 中有效,但在 Firefox 中无效?

为啥 cURL 不适用于 IIS7 上的 Windows 身份验证?

为啥我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败?

为啥客户端在 IE 中访问网络时集成 Windows 身份验证失败?

为啥我的SQL 2005用Windows身份验证登陆的时候出现18456错误