首页 > 解决方案 > 如何使 Asp.Net Core Identity 与 OpenIdConnect 一起使用

问题描述

如何从 asp.net 核心项目重新生成 open id connect 自定义声明?

我已经设置手动映射到声明类型名称,但有时我需要从事件 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)。

标签: c#asp.net-coreasp.net-identityopenid-connect

解决方案


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

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

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

推荐阅读