iis - 如何使用 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 用户,而是使用来自浏览器的凭据)。
解决方案
可以在任何 .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);
}
推荐阅读
- html - 页面上的第二个轮播
- c# - T-SQL / EF Where Col 为真假过滤结果
- aws-appsync - 使用 GraphQL 转换在 AWS AppSync 中生成带有参数的订阅
- maven - 了解 Maven 插件
- python - 从模块导入类但功能不起作用
- html - JSoup:如何列出列表中的链接?
- ios - 当我的 iPhone 接到电话时如何截屏
- java - java `wait()` 等待是如何实现的?
- typescript - 如何使用 Typescript 和 gulp 从多个文件生成单个文件?
- java - 使用 Spring Boot 应用程序在运行时编译类