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
我目前正在我的 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