.Netcore 2.0获取当前登录用户

时间:2017-12-19 22:24:04

标签: asp.net-core-2.0

我试图使用.Net-Core 2.0获取当前登录的Windows userId。 在.Net-core 2.0中实现这一目标的正确方法是什么?此用户所属的群组是什么?

2 个答案:

答案 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

设置

我有两台服务器:

  1. Identity Server
  2. 客户端服务器
  3. 单独项目(或域)上的身份验证服务器和客户端服务器。因此,它们之间没有任何通信(授权除外)

    身份服务器使用 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进行额外调用(这可能在技术上会产生某种形式的安全风险)

    解决方案:穷人的Jwt Claim Types用户名提取器

    所以我写了一个小扩展函数来从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并尝试提取用户的名称,因为用户名几乎总是一个电子邮件,它会尝试解析电子邮件以返回用户名。它只有在用户名是可解析的内容时才可用。

    希望这有帮助。