我只是建立了我的用户和角色策略表以及一个用于连接的表
这些要收集,但如何告诉 services.AddAuthorization 来查找
哪个表中的哪个策略。
默认情况下,在微软官方文档中(关于基于角色或基于策略的授权),它使用Asp.net core Identity来管理用户和角色。
根据您的描述,我假设您也使用 Asp.net 身份页面登录和注销,对吗?如果是这种情况,由于您使用的是自定义用户和角色表,因此在Login.cshtml.cs 文件中,用户登录成功后,您可以根据登录用户的电子邮件查询此表并获取用户的角色。然后将角色声明添加到当前用户。之后,您可以根据声明创建策略。
您可以查看以下示例代码:
在Login.cshtml.cs 页面中:
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
//find current user.
var user = await _userManager.FindByEmailAsync(Input.Email);
//based on user information to query the user and role policy table. Here I set the user role directly.
var userrole = "User";
if (user.UserName.Contains("aa"))
{
userrole = "Admin";
}
//add claims to current user.
await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, userrole));
var claimsPrincipal = await _signInManager.CreateUserPrincipalAsync(user);
await _signInManager.RefreshSignInAsync(user);
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
在 ConfigureServices 方法中,根据声明创建策略。
services.AddAuthorization(options =>
{
options.AddPolicy("RequiredAdmin", policy =>
policy.RequireClaim(ClaimTypes.Role, "Admin"));
});
然后,在 Configure 方法中,添加以下代码:
app.UseAuthentication();
app.UseAuthorization();
并将策略应用于操作方法:
[Authorize(Policy = "RequiredAdmin")]
public IActionResult Privacy()
{
return View();
}
结果如下:用户aa是Admin角色,bb是User角色。
另外,还有一些相关的文章,大家可以参考一下:
Policy-based authorization in ASP.NET Core
Policy-Based And Role-Based Authorization In ASP.NET Core 3.0 Using Custom Handler
Cookie Authentication In ASP.NET Core(如果你不使用Asp.net core Identity,可以参考这篇文章并配置策略)。