首页 > 解决方案 > 如何使用 IIS 从 Blazor 服务器获取 WindowsIdentity.RunImpersonated(token, action) 的 HttpContext(或 AccessToken)

问题描述

我在 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 用户,而是使用来自浏览器的凭据)。

标签: iisblazor

解决方案


可以在任何 .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);
        }

推荐阅读