【发布时间】:2021-10-23 23:34:15
【问题描述】:
因此,当此代码运行时,用户获得了身份验证,我看到他们有我提供给他们的相关声明。但是,他们无权查看任何页面,因为他们没有正确的 AuthorizationPolicy。我认为给他们“Court User”的角色并对其进行身份验证会给他们默认的“Court_Users”AuthorizationPolicy,因为这符合要求,但它不能这样工作。
当用户通过身份验证后,如何为他们分配符合要求的授权策略?
启动页面:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Shared/login";
options.AccessDeniedPath = "/Shared/login";
});
services.AddRazorPages().AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/NonCourt_Users","Non Court User");
options.Conventions.AuthorizeFolder("/Court_Users","Court_Users");
options.Conventions.AllowAnonymousToPage("/Shared");
});
services.AddAuthorization(options =>
{
options.AddPolicy("Court_Users", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim("role", "Court User")
.Build());
options.AddPolicy("NonCourt_Users", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim("role", "Non Court User")
.Build());
});
登录页面:
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, User.EmailAddress));
identity.AddClaim(new Claim(ClaimTypes.Name, User.Name.First_Name));
if (User.CourtUser)
{
identity.AddClaim(new Claim(ClaimTypes.Role, "Court User"));
}
else
{
identity.AddClaim(new Claim(ClaimTypes.Role, "Non Court User"));
}
var principal = new ClaimsPrincipal(identity);
var authProperties = new AuthenticationProperties
{
AllowRefresh = true,
ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60),
IsPersistent = true
};
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(principal), authProperties);
HttpContext.Session.SetObjectAsJson("CurrentUser", User);
clearSession();
【问题讨论】:
-
如果您使用 IdentityServer4,则必须将您的 ApiScope 添加到策略中,然后将您的范围添加到声明中
标签: c# asp.net-core authentication razor authorization