ASP.NET - 身份验证问题:下一个请求中缺少手动添加的声明

ASP.NET - Problem with authentication: Manually added claim is missing in the next request

我目前正在我的 ASP.NET 应用程序中尝试使用外部登录提供程序,例如 Google 身份验证。

正如你在我的 Program.cs 上看到的,我是 运行 .NET6.

Google-登录成功后,ClaimsPrincipal 只有一个 ClaimsIdentity (IsAuthenticated == true)。现在我想把我自己的 'Custom-Claim' 添加到这个身份中。添加没有任何问题,但下一个请求缺少自定义声明(Google 的所有其他声明都在那里)。

这是我的 Program.cs 的一部分,我在其中添加了身份验证:

builder.Services.AddAuthentication(x =>
{
    x.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(GoogleDefaults.AuthenticationScheme, o =>
{
    o.ClientId = builder.Configuration["Authentication:Google:ClientId"];
    o.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];   
    o.ClaimActions.MapJsonKey("urn:google:picture","picture","url");
});

这里是Program.cs中的中间件管道的配置:

app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();

app.Use((httpContext, func) =>
{
    if (httpContext.Request.Path.StartsWithSegments("/api"))
        httpContext.Request.Headers[HeaderNames.XRequestedWith] = "XMLHttpRequest";

    return func();
});

app.UseRouting();
app.MapRazorPages();
app.MapControllers();

Google 登录的端点:

[HttpGet]
[Route("GoogleSignIn")]
public async Task GoogleSignIn()
{
    await HttpContext.ChallengeAsync(GoogleDefaults.AuthenticationScheme,
        new AuthenticationProperties {RedirectUri =Url.Action("GoogleResponse")});
}

在“Google响应”方法中,我添加了提到的自定义声明:

//this method gets called after the google login has finished
public async Task<IActionResult> GoogleResponse()
{
    var result = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    
    var identity = result.Principal.Identities.FirstOrDefault();
    var currentSidClaim = identity.FindFirst(x => x.Type == ClaimTypes.Sid);

    if (currentSidClaim != null)
        identity.RemoveClaim(currentSidClaim);
    
    identity.AddClaim(new Claim(ClaimTypes.Sid, "Hi i am some claim, but i'll miss on the next request :("));
   
    return Redirect("/");
}

添加声明后的 ClaimsIdentity:

[https://i.stack.imgur.com/INdGy.png]

下一个请求的 ClaimsIdentity(顺便说一句,在同一个控制器中):

[https://i.stack.imgur.com/oft3e.png]

无论我是通过“User.Identity”还是“HttpContext.User...”访问身份都没有区别。

真的希望有人能帮我解决问题。

我希望我不必实施大型/复杂的 ASP.NET 身份解决方案来解决问题。我会对轻量级身份验证感到满意。

更新:

经过一些进一步的测试,它似乎与特定的 Google 登录不一定相关。即使我在登录时创建了第二个身份,它也会在下一个请求时消失。

我想身份验证 cookie 没有更新。

提前致谢!

尝试从外部网站回调后添加声明。如上所述here