我在IIS上托管的MVC.NET Core和我的开发环境中非常成功地使用了以下内容(WindowsIdentity。GetCurrent((。AccessToken在开发中与IISExpress配合良好(
public void RunImpersonated(HttpContext context, Action action)
{
// When running in IIS Express AccessToken(context) returns "NT AUTHORITYANONYMOUS 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中这样做。
在启动.配置我有:
app.UseAuthorization();
app.UseAuthentication();
在Startup.ConfigureServices中,我有:
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
在IIS中,该站点设置为WindowsAuthentication=Enabled,Anonymous=Disabled。最终,我想使用DatabaseConnection.SsisIntegratedSecurity调用SQL,并希望以当前windows身份验证用户(不是AppPool用户,而是使用来自浏览器的凭据(的身份进行调用。
访问令牌可以在任何.rarzor页面上获得,如下所示:
@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);
}