如何使Asp.Net Core Identity与OpenIdConnect一起使用

时间:2019-04-08 19:39:07

标签: c# asp.net-core asp.net-identity openid-connect

如何从asp.net核心项目中重新生成开放ID连接自定义声明?

我已经设置了手动映射到声明类型名称的方法,但是有时候我需要从事件OnTicketRecieved之外(即从控制器)更新其他声明,因此在那个阶段我确实需要以某种方式重新生成声明。我已经通过以下方式设置了openIdConnect:

        _services
            .AddAuthentication(options =>
            {
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddOpenIdConnect(options =>
            {
                options.ClientId = clientId;
                options.ClientSecret = clientSecret;
                options.Authority = $"{baseAuthorityUrl}/{tenantId}";
                options.CallbackPath = new PathString(callBackPath);
                options.Scope.Add("email");
                options.Scope.Add("profile");

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name"
                };

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
                options.Events = new OpenIdConnectEvents
                {
                    OnRedirectToIdentityProvider = e =>
                    {

                        return Task.CompletedTask;
                    },
                    OnTicketReceived = e =>
                    {
                        e.Principal.Identities.First().AddClaim(new Claim(ClaimTypes.Name, e.Principal.FindFirstValue("name")));

                        return Task.CompletedTask;
                    }
                };
            })

我如何从管制员那里重新产生索赔? 我在想只是以某种方式覆盖signInManager.RefreshSignInAsync(user)。

1 个答案:

答案 0 :(得分:0)

如果要在初始登录后在控制器中添加声明,则应使身份验证管理器使用新身份:

if (HttpContext.User.Identity is ClaimsIdentity identity)
{

    identity.AddClaim(new Claim("userId", "1234"));
    await HttpContext.SignInAsync(
        CookieAuthenticationDefaults.AuthenticationScheme,
        new ClaimsPrincipal(HttpContext.User.Identity));
}