.NET Core IdentityServer4获取经过身份验证的用户

7

我正在尝试使用.Net-Core 2从Identity Server 4中检索已登录的用户。 目前我的身份验证正在工作,我只是想弄清楚如何从HTTP上下文中检索声明标识。

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
}).AddIdentityServerAuthentication(o =>
{
    o.Authority = IDP_AUTHORITY_URL;
    o.RequireHttpsMetadata = false;
    o.ApiName = API_ID;
    o.JwtBearerEvents = new JwtBearerEvents
    {
        OnTokenValidated = async tokenValidationContext =>
        {
            var claimsIdentity = tokenValidationContext.Principal.Identity as ClaimsIdentity;
            if (claimsIdentity == null)
            {
                return;
            }

            string userId = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "sub").Value;

            if (string.IsNullOrEmpty(userId))
            {
                throw new AuthenticationException("Error obtaining Subject claim");
            }
        }
    };
});

我有一个服务,需要登录的用户才能使用,但我不知道如何获取已登录的用户。

public interface IAuthenticatedUserManager<T>
    where T: class
{
    T GetLoggedInUser();
}

public class AuthenticatedUserManager : IAuthenticatedUserManager<User>
{
    public User GetLoggedInUser()
    { 
        //HttpContext.Current
    }
}

以前在HttpContext.Current上,但是我在.Net Core 2中没有看到这个选项。如何从.Net Core 2中检索我的ClaimsIdentity?


1
你有看过 HttpContext.User.Identity 吗?听起来这就是你所询问的内容。 - Neil
谢谢,我回家后会检查! - johnny 5
@NeilBostian 这是一个 HttpContext 的实例吗?我没有使用控制器。我试图在静态方法上尝试,HttpContext 默认可注入吗?我该如何获取 httpcontext 的实例? - johnny 5
2个回答

6
这应该适合你的需求:
var user = (HttpContext.User.Identity as ClaimsIdentity);

然后用户对象拥有您所需的内容。


这是一个HttpContext的实例吗?我没有使用控制器。我正在尝试在静态方法上,HttpContext默认可注入吗?我怎样才能获得HttpContext的实例? - johnny 5
1
@johnny5 应该是这样的 var user = Context.User.Identity as ClaimsIdentity; - pnizzle

4

我找到了解决这个问题的方法。由于我使用的是需要HttpContext注入的自定义服务,所以我需要注册一个可注入的访问器:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

然后在我的认证管理器中,我可以访问我的HttpContext。
public class UserAuthenticationManager : IUserAuthenticationManager
{
    HttpContext _httpContext;

    public UserAuthenticationManager(IHttpContextAccessor httpContextAccessor)
    {
        this._httpContext = httpContextAccessor?.HttpContext;
    }
    public ClaimsIdentity GetClaimsIdentity()
    {
        return (this._httpContext.User.Identity as ClaimsIdentity);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接