如何使用IIS从Blazor服务器获取WindowsIdentity.RunImpersonated(令牌、操作)的HttpContext(或AccessToken)
我在IIS上托管的MVC.NET Core和我的开发环境中(WindowsIdentity.GetCurrent().AccessToken在开发中与IISExpress配合使用很好)非常成功地使用了以下内容 我现在想对Blazor服务器做一些类似的事情,但是当代码在我的IIS生产服务器上运行时,我很难获得一个HttpContext来传递给这个方法 我尝试注入IHttpContextAccessor并调用其.HttpContext,但它总是返回null,我不确定我是否应该在Blazor中这样做 在Startup.Configure中,我有:如何使用IIS从Blazor服务器获取WindowsIdentity.RunImpersonated(令牌、操作)的HttpContext(或AccessToken),iis,blazor,Iis,Blazor,我在IIS上托管的MVC.NET Core和我的开发环境中(WindowsIdentity.GetCurrent().AccessToken在开发中与IISExpress配合使用很好)非常成功地使用了以下内容 我现在想对Blazor服务器做一些类似的事情,但是当代码在我的IIS生产服务器上运行时,我很难获得一个HttpContext来传递给这个方法 我尝试注入IHttpContextAccessor并调用其.HttpContext,但它总是返回null,我不确定我是否应该在Blazor中这样做
app.UseAuthorization();
app.UseAuthentication();
在Startup.ConfigureServices中,我有:
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
在IIS中,站点设置为启用WindowsAuthentication,禁用Anonymous。
最后,我希望使用DatabaseConnection.SsisIntegratedSecurity调用SQL,并希望以当前windows身份验证用户(不是AppPool用户,而是使用来自浏览器的凭据)的身份进行调用。可以在任何.razor页面上获取访问令牌,如下所示:
@inject AuthenticationStateProvider AuthenticationStateProvider
.
.
.
var token = ((WindowsIdentity) AuthenticationStateProvider.GetAuthenticationStateAsync().Result.User.Identity).AccessToken;
在IIS上允许:
ImpersonationHelper.RunImpersonated(token,
() =>
{
// for example
SsisJobs.StartJob(jobName);
}
);
请看:这对IP地址非常有效,我已经在那里发布了我的代码,但是当我以一种简单的方式保存AccessToken时,当我开始使用它时,我收到了“安全句柄已关闭”错误。
ImpersonationHelper.RunImpersonated(token,
() =>
{
// for example
SsisJobs.StartJob(jobName);
}
);
public class ImpersonationHelper : IImpersonationHelper
{
.
.
.
public void RunImpersonated(SafeAccessTokenHandle accessToken, Action action)
{
WindowsIdentity.RunImpersonated(accessToken, action);
}