如何使用 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