繁体   English   中英

如何在C#Web API同步和异步中获取Windows身份验证用户

[英]How to get Windows Authenticated user in C# Web API sync and async

我需要一些帮助才能解决我在工作中遇到的问题。 我们在.NET Framework 4.7.1中有一个Web API(它有一个API,应用程序,核心,测试项目)。 该项目很复杂,它包含来自10多个不同开发人员的代码。 我们使用Microsoft Dynamics D365 8.2 OnPremise来获取数据,因此,只要我们必须进行CRUD操作,我们就必须通过其SDK代码与CRM连接。 该项目托管在IIS 8.5 Windwos Server 2012 R2上,前端是Angular 5(我们使用withCredentials选项进行API调用)。 我们启用了Windows身份验证和ASP.NET模拟,并禁用了所有其他身份验证方法。 在我们的C#代码中,99%的时候我们连接到CRM SDK,我们还需要冒充用户,我们通过传递用户名来获取Guid。 此代码已经工作了很长时间,直到最近我们发现我们的代码是错误地随机设置用户。

有时不起作用的代码是:

System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent()).Identity.Name

大多数情况下,我们获得了正确的用户,但有时它会让用户在IIS中运行该进程。

我也尝试过:

System.Web.HttpContext.Current.User.Identity.Name

但有时这是空的

最后我认为解决方案是:

System.Threading.Thread.CurrentPrincipal.Identity.Name

这适用于我的许多测试。 问题是,过了一会儿(我想如果服务在Task.Run(()=> {}内调用);阻止它会产生错误:System.ObjectDisposedException:安全句柄已关闭

我阅读了以下文章以获得帮助:关于.net web api的官方文档: https//docs.microsoft.com/en-us/aspnet/web-api/overview/security/authentication-and-authorization-in-aspnet-网络API

这篇文章谈到一个非常类似的问题: https//social.msdn.microsoft.com/Forums/vstudio/en-US/bca4556e-53f3-427c-a51a-9b955e2395e2/how-to-get-the-windows-identity -通过Web方式的API-2-IN-A-intranetlocal -网络设置?论坛= WCF#89485c63-352b-434A-862B-8c5f4cec620c

关于安全句柄的这两篇帖子已经关闭: 在校对后台工作项中保留主体 设置Thread.CurrentPrincipal异步?

这使我尝试编写一些代码(保持System.Threading.Thread.CurrentPrincipal.Identity.Name工作,但仍然抛出错误):

    ClaimsPrincipal principal = new ClaimsPrincipal(Thread.CurrentPrincipal);
    // Save Total Payment Stream Payments (Async)
    Task.Run(() =>
    {
        HttpContext.Current.User = new ClaimsPrincipal(new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", principal.Identity.Name) }, "auth")));
        Thread.CurrentPrincipal = principal;
        SaveTotalPaymentStream(opportunityTermId);
    });

任何有关这方面的想法或建议都会很棒。 也许我需要一些更复杂的东西,比如创建一个自定义的Principal,或者我只是弄乱了Task.Run(我终于认为我弄明白了......)

谢谢!

我学到的是用异步方法获取登录用户可能非常棘手。 HttpContext对于同步代码非常可靠,当我绝对需要登录用户时,我只是将一个变量传递给我的异步代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM