为什么在 iframe 中使用 .net core 2 AuthorizationHandler 时标识为空



我有以下AuthorizationRequirementAuthorizationHandler在 DI 注册并且工作正常。但是,当在 iframe(同源)中调用具有[Authorize(Policy = "ConfirmedEmail")]的操作时,context.User.Identity.Name始终为 NULL,因此user也是如此。有没有人知道为什么会这样,更重要的是如何解决它?

当直接调用完全相同的操作(在 iframe 外部)时,context.User.Identity.Name是正确的,用户查找成功。

public class ConfirmedEmailRequirement : IAuthorizationRequirement { }
public class ConfirmedEmailHandler : AuthorizationHandler<ConfirmedEmailRequirement>
{
private readonly UserManager<User> _userManager;
public ConfirmedEmailHandler(UserManager<User> userManager)
{
_userManager = userManager;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, ConfirmedEmailRequirement requirement)
{
var user = await _userManager.GetUserAsync(context.User);
if (user?.EmailConfirmed == true)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}
}

更新:我注意到,尽管 iframe 和非 iframe 请求具有相同的会话 cookie,但非 iframe 请求包含Core.Identity.Applicationcookie,而 iframe 请求则没有。我不知道这有什么意义,也不知道是什么原因造成的。

我终于设法使用以下方法让身份在 iframe 中工作:

services.ConfigureApplicationCookie(options => {
options.Cookie.Name = "MyAuthCookie";
options.Cookie.SameSite = SameSiteMode.None; //<THIS!!!
});

希望有一天这可以为某人节省很多挠头。

最新更新