如何告诉 services.AddAuthorization 我的自定义用户和角色 table 在哪里
how to tell services.AddAuthorization where is my custom user and role table is
我只是建立了我的用户和角色策略 table 和一个 table 用于连接这些以收集但是如何告诉 services.AddAuthorization 寻找哪个策略 table.
我看过Microsoft Role-based authorization的文档,但是他们没有使用自定义用户和角色table我什至不知道怎么问我的问题我很困惑
我的意思是它怎么知道我们在这张图片中寻找管理员
I just build my user and role policy table and a table for connecting
these to gather but how to tell services.AddAuthorization to looking
for which policy in which table.
微软官方文档(关于Role-based or Policy-based authorization)默认使用Asp.net core Identity来管理用户和角色。
根据你的描述,我假设你也使用Asp.net身份页面登录和注销,对吧?如果是这样,由于您使用的是自定义用户和角色 table,在 Login.cshtml.cs
文件中,用户登录成功后,您可以根据登录用户的电子邮件查询此 table并获得用户的角色。然后将角色声明添加到当前用户。之后,您可以根据声明创建策略。
您可以查看下面的示例代码:
在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,可以参考这篇文章配置策略)
我只是建立了我的用户和角色策略 table 和一个 table 用于连接这些以收集但是如何告诉 services.AddAuthorization 寻找哪个策略 table.
我看过Microsoft Role-based authorization的文档,但是他们没有使用自定义用户和角色table我什至不知道怎么问我的问题我很困惑
我的意思是它怎么知道我们在这张图片中寻找管理员
I just build my user and role policy table and a table for connecting these to gather but how to tell services.AddAuthorization to looking for which policy in which table.
微软官方文档(关于Role-based or Policy-based authorization)默认使用Asp.net core Identity来管理用户和角色。
根据你的描述,我假设你也使用Asp.net身份页面登录和注销,对吧?如果是这样,由于您使用的是自定义用户和角色 table,在 Login.cshtml.cs
文件中,用户登录成功后,您可以根据登录用户的电子邮件查询此 table并获得用户的角色。然后将角色声明添加到当前用户。之后,您可以根据声明创建策略。
您可以查看下面的示例代码:
在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,可以参考这篇文章配置策略)