我已经实现了IdentityServer4。该应用程序正在运行ASP.NET Core。托管环境位于IIS上。我正在使用Shibboleth对网站执行预身份验证。这将在IIS中填充许多服务器变量。 (我们不能在我们的环境中使用HTTP标头,所有操作都必须使用ServerVariables完成)
我想获取服务器变量'AUTH_USER'或'REMOTE_USER'。
在旧版ASP或ASP.NET中,这就像调用Request.ServerVariable(“ AUTH_USER”)一样简单。这在ASP.NET Core中已更改。
我尝试过 ClaimsPricipal-> User.Identity.Name,(用户名为空,IsAuthenticated为false)
我已经确认服务器变量实际上已设置。
This question is similar to this question but doesn't answer the question
答案 0 :(得分:2)
在Asp.Net Core 3中,GetServerVariable
上有一个扩展方法HttpContext
。
要使用它,您需要安装Microsoft.AspNetCore.Http.Extensions
NuGet软件包,并且实际方法在Microsoft.AspNetCore.Http.HttpContextServerVariableExtensions
类中。
请注意,服务器必须支持它,否则它将返回null
。
对于早期版本的ASP.Net Core,您可以通过调用context.Features.Get<IServerVariablesFeature>()
答案 1 :(得分:2)
.NET (Core) 团队在上一个版本中对此进行了多次更改。我无法通过上下文功能使 HttpContextServerVariableExtensions 版本和旧变体正常工作。
但是this gist帮助了我。可与 AWS fargate 上的 .NET 5 配合使用,可能具有某种负载均衡器直通功能。
aws-sdk
我假设您可以从标题中获取任何这样的值。 public static class HttpContextExtensions
{
//https://gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36
public static IPAddress GetRemoteIPAddress(this HttpContext context, bool allowForwarded = true)
{
if (allowForwarded)
{
string header = (context.Request.Headers["CF-Connecting-IP"].FirstOrDefault() ?? context.Request.Headers["X-Forwarded-For"].FirstOrDefault());
if (IPAddress.TryParse(header, out IPAddress ip))
{
return ip;
}
}
return context.Connection.RemoteIpAddress;
}
}
。请注意,您无法在本地调试标头。由于我的本地设置不同,我没有看到这些条目。我看到了可用的魔法字符串,例如here。