我在Service Fabric上运行了一个ASP.NET核心应用程序(3个节点),要求用户通过microsoft对自己进行身份验证,以获得对O365环境的访问权限。验证成功后,它们会被重定向到我的应用程序,用户的信息将存储到包含特定角色的cookie中(如管理员):
var claims = new List<Claim> {
new Claim(ClaimTypes.GivenName, authResult.UserInfo.GivenName, ClaimValueTypes.String),
new Claim(ClaimTypes.Name, authResult.UserInfo.FamilyName, ClaimValueTypes.String),
new Claim(ClaimTypes.Email, authResult.UserInfo.DisplayableId, ClaimValueTypes.String),
new Claim("aud", userId, ClaimValueTypes.String),
new Claim(ClaimTypes.Role, "Office365Admin", ClaimValueTypes.String)
};
以下是我设置cookie中间件的方法:
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", userPrincipal,
new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
IsPersistent = true,
AllowRefresh = true
});
然后我在我的其他控制器方法上使用典型的授权,以确保请求此方法的用户是正确的角色:
[Authorize(Roles = "Office365Admin")]
这在我的本地环境(1到5个节点)上工作得很好但是一旦我进入我的3节点azure群集,用户就会被随机重定向到我的LoginPath(这意味着传入请求的cookie不包含正确的角色,或者至少服务器无法识别它。这似乎是随机发生的,我可以在没有发生这种情况的情况下发出4-5个请求,或者对于发送10秒的所有请求都可能发生这种情况。我认为这可能是一些负载问题,因为禁用3个节点中的2个似乎正在解决问题,但这不是一个可靠的解决方案。