如何使用 IIS 从 Blazor 服务器获取 WindowsIdentity.RunImpersonated(token, action) 的 HttpContext(或 AccessToken)

Posted

技术标签:

【中文标题】如何使用 IIS 从 Blazor 服务器获取 WindowsIdentity.RunImpersonated(token, action) 的 HttpContext(或 AccessToken)【英文标题】:How to obtain HttpContext (or AccessToken) for WindowsIdentity.RunImpersonated(token, action) from Blazor Server with IIS 【发布时间】:2021-08-19 11:41:23 【问题描述】:

我在 IIS 上托管的 MVC .NET Core 和我的开发环境中非常成功地使用了以下内容(WindowsIdentity.GetCurrent().AccessToken 在开发中与 IISExpress 配合使用)

 public void RunImpersonated(HttpContext context, Action action)
        
            // When running in IIS Express AccessToken(context) returns "NT AUTHORITY\ANONYMOUS LOGIN"

            SafeAccessTokenHandle token;

            if (_env.IsDevelopment())
            
                token = WindowsIdentity.GetCurrent().AccessToken;
            
            else
            
                token = AccessToken(context);
            

            WindowsIdentity.RunImpersonated(token, action);
        

我现在想对 Blazor Server 做一些类似的事情,但是当代码在我的 IIS 生产服务器上运行时,我很难让 HttpContext 传递给这个方法。

我尝试注入 IHttpContextAccessor 并调用它的 .HttpContext 但它总是返回 null,我不确定我是否应该在 Blazor 中这样做。

在 Startup.Configure 我有:

          app.UseAuthorization();
          app.UseAuthentication();

在 Startup.ConfigureServices 我有:

 services.AddAuthentication(IISDefaults.AuthenticationScheme);
 services.AddAuthorization();

在 IIS 中,站点设置为 WindowsAuthentication = Enabled,Anonymous = Disabled。 最终,我想使用 DatabaseConnection.SsisIntegratedSecurity 调用 SQL,并希望以当前 Windows 身份验证用户的身份进行调用(不是 AppPool 用户,而是使用来自浏览器的凭据)。

【问题讨论】:

看看:***.com/questions/64530246/… 这对 IP 地址很有用,我已经在那里发布了我的代码,但是当我以类似的方式保存 AccessToken 时,当我开始使用它时,我收到“安全句柄已关闭”错误。 【参考方案1】:

Access Token 可以在任何 .razor 页面上获取,如下所示:

@inject AuthenticationStateProvider AuthenticationStateProvider

.
.
.
  
 var token = ((WindowsIdentity) AuthenticationStateProvider.GetAuthenticationStateAsync().Result.User.Identity).AccessToken;

允许,在 IIS 上:

ImpersonationHelper.RunImpersonated(token,
            () =>
            
                // for example
                SsisJobs.StartJob(jobName);
            
            );

  public class ImpersonationHelper : IImpersonationHelper
    

.
.
.
      public void RunImpersonated(SafeAccessTokenHandle accessToken, Action action)
        
            WindowsIdentity.RunImpersonated(accessToken, action);
        

【讨论】:

以上是关于如何使用 IIS 从 Blazor 服务器获取 WindowsIdentity.RunImpersonated(token, action) 的 HttpContext(或 AccessToken)的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 Blazor 服务器端应用程序 IIS 8.5 保持活力

IIS 回收应用程序池时如何保持 Blazor 服务器连接处于活动状态

如何使用默认网站在 iis 中配置 blazor 应用程序?

如何从 blazor(服务器端)Web 应用程序获取访问令牌?

Cors Policy 问题 Blazor WASM、Web API 和 Identity Server 4 和 IIS

如何从数据库 Blazor C# 中获取 Id 数据