我将 [Authorize] 属性添加到主控制器。
当用户登录时,此处是运行的代码:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
User user = AuthManager.AuthenticateUser(model.Email, model.Password);
if (user != null && user.Authenticated)
{
ClaimsPrincipal principal = new ClaimsPrincipal();
IList<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
new Claim(ClaimTypes.Email, user.Email)
};
// Add role claims
foreach (RoleResource role in user.Roles)
{
claims.Add(new Claim(ClaimTypes.Role, role.Name));
}
principal.AddIdentity(new ClaimsIdentity(claims));
AuthenticationProperties authProperties = new AuthenticationProperties()
{
IsPersistent = model.RememberMe,
ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30)
};
await HttpContext.Authentication.SignInAsync("MyAppCookieMiddleware", principal, authProperties);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
我看到创建了 2 个饼干,这是正确的。
当我尝试从主控制器访问页面时,我被推送到我在 Startup 中设置的禁止页面.cs:
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "MyAppCookieMiddleware",
LoginPath = new PathString("/Auth/Login/"),
AccessDeniedPath = new PathString("/Auth/Forbidden/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
尝试将行从
principal.AddIdentity(new ClaimsIdentity(claims));
自
principal.AddIdentity(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme));
只是为了补充索汉姆的答案,你可能想读这篇文章。
使用构造函数时
ClaimsIdentity(IEnumerable<Claim> claims)
属性AuthenticationType
的值为null
。属性IsAuthenticated
的返回值为"true,如果 AuthenticationType 属性不为 null 或空字符串"。
使用构造函数
ClaimsIdentity(IEnumerable<Claim> claims, string authenticationType)
如果值不为null 也不为空,authenticationType
将导致isAuthenticated
属性返回True
。