我试图使用.Net-Core 2.0获取当前登录的Windows userId。 在.Net-core 2.0中实现这一目标的正确方法是什么?此用户所属的群组是什么?
答案 0 :(得分:0)
在您的控制器中,执行:User.Identity.GetUserId();
。
否则,您需要在课程中注入IHttpContextAccessor _http;
,然后_http.HttpContext.User?.Identity?.GetUserId();
。下面的示例:
public class Test
{
private readonly IHttpContextAccessor _http;
public Test(IHttpContextAccessor http)
{
_http = http;
}
public int? GetUserId()
{
return _http.HttpContext.User?.Identity?.GetUserId();
}
}
答案 1 :(得分:0)
这个问题现在有点老了,但是我还没有找到这个具体设置的答案:
ClaimsPrincipal currentUser = this.User;
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
currentUserName
返回null
我有两台服务器:
单独项目(或域)上的身份验证服务器和客户端服务器。因此,它们之间没有任何通信(授权除外)
身份服务器使用 Jwt令牌进行身份验证。
在身份服务器的Startup.cs
中:
public void ConfigureServices(IServiceCollection services)
{
...
var identityBuilder = services.AddIdentityServer();
identityBuilder
.AddInMemoryApiResources(
new List<ApiResource>
{
new ApiResource("app name", "app displayname", new[] { JwtClaimTypes.Role, JwtClaimTypes.Name}) {UserClaims = {JwtClaimTypes.Name, JwtClaimTypes.Role}}
};
)
...
}
^^这对解决方案部分
非常重要当用户呼叫客户端服务器时,服务器无法真正访问客户端的凭据,而无需对Identity Server进行额外调用(这可能在技术上会产生某种形式的安全风险)
所以我写了一个小扩展函数来从ClaimsPrincipal
中提取某种形式的用户名,这不是傻瓜证明,但至少应该有用。
public static string GetUsername(this ClaimsPrincipal user)
{
var username = user?.Identity?.Name;
if (username != null)
{
return username;
}
// Get username from claim, this is usualy an email
var claim = user?.FindFirst(x => x.Type == JwtClaimTypes.PreferredUserName) ??
user?.FindFirst(x => x.Type == JwtClaimTypes.Name);
if (claim == null)
{
return null;
}
username = claim.Value;
var atIndex = username.IndexOf('@');
if (atIndex > 0)
{
username = username.Substring(0, atIndex);
var name = username.Split('.', StringSplitOptions.RemoveEmptyEntries);
username = "";
foreach (var n in name)
{
if (n.Length > 2)
{
username += n.First().ToString().ToUpper() + n.Substring(1) + " ";
}
else
{
username += n.ToUpper() + " ";
}
}
}
return username.Trim();
}
此代码基本上做的是:它需要ClaimsPrincipal
并尝试提取用户的名称,因为用户名几乎总是一个电子邮件,它会尝试解析电子邮件以返回用户名。它只有在用户名是可解析的内容时才可用。
希望这有帮助。