我在DI注册了以下AuthorizationRequirement
和AuthorizationHandler
,工作正常。但是,当在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.Application
Cookie,而iframe请求则不包含let translation = pan.translation(in: pan.view!)
Cookie。我不知道这个或其原因的重要性。
答案 0 :(得分:4)
我终于设法使用以下内容在iframe中工作:
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = "MyAuthCookie";
options.Cookie.SameSite = SameSiteMode.None; //<THIS!!!
});
希望有一天这会让很多人感到头疼。