C# 如何从DB获取用户角色以填充authorized属性
我有一个.netcore mvc应用程序,其中我有CustomRoles类中的角色:C# 如何从DB获取用户角色以填充authorized属性,c#,asp.net-core,authorization,microservices,roles,C#,Asp.net Core,Authorization,Microservices,Roles,我有一个.netcore mvc应用程序,其中我有CustomRoles类中的角色: public class CustomRoles { ///<Summary>Manager role</Summary> public const string Manager = "Manager"; ///<Summary>Publisher role </Summary> public co
public class CustomRoles
{
///<Summary>Manager role</Summary>
public const string Manager = "Manager";
///<Summary>Publisher role </Summary>
public const string Publisher = "Publisher";
}
这是我创建的解决方案,但我被卡住了。我实现了一个角色类:
public class Role
{
/////<Summary>Manager role</Summary>
public string RoleName { get; set; }
}
公共类角色
{
/////经理角色
公共字符串RoleName{get;set;}
}
以及从数据库获取角色的方法:
/// <summary>
/// Get All Roles
/// </summary>
/// <returns></returns>
public async Task<List<Role>> GetRoles()
{
GetResponse response = new GetResponse();
List<Role> CRoles = new List<CustomRoles>();
response = await database.ObjectGetTypedListAsync<Role>("", "Role");
CRoles = (List<Role>)response.StronglyTypedObject;
return CRoles;
}
//
///获得所有角色
///
///
公共异步任务GetRoles()
{
GetResponse=新的GetResponse();
List CRoles=新列表();
response=wait database.objectGetTypedListSync(“,”角色”);
CRoles=(列表)response.StronglyTypedObject;
返回克罗尔;
}
有什么办法可以做到这一点吗?要基于数据库中的数据检查角色,您可以实现自己的
IAuthorizationFilter
如
[AttributeUsage(AttributeTargets.Class)]
public class MyAuthorize : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var dbContext = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();
var roles = dbContext.Roles.ToList();
foreach (var role in roles)
{
if (!context.HttpContext.User.IsInRole(role.Name))
{
context.Result = new ForbidResult();
}
}
}
}
您所说的数据库中的角色是什么意思?您需要指定此方法的角色。从db获取所有角色,检查db列表中是否存在“授权”属性上的角色列表,如果存在,则将其填充到“授权”属性。混淆。
检查db
列表中是否存在Authorize属性上的角色列表是什么意思。根据您的代码编写[授权(角色=//数据库中的角色)]
,您对该角色的期望值是多少?将您在数据库中的记录和此角色的值共享给我们。无论如何,请检查我的答案,看看如何实现您自己的authorize属性。对于内置的授权
,这是不可能的。
/// <summary>
/// Get All Roles
/// </summary>
/// <returns></returns>
public async Task<List<Role>> GetRoles()
{
GetResponse response = new GetResponse();
List<Role> CRoles = new List<CustomRoles>();
response = await database.ObjectGetTypedListAsync<Role>("", "Role");
CRoles = (List<Role>)response.StronglyTypedObject;
return CRoles;
}
[AttributeUsage(AttributeTargets.Class)]
public class MyAuthorize : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var dbContext = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();
var roles = dbContext.Roles.ToList();
foreach (var role in roles)
{
if (!context.HttpContext.User.IsInRole(role.Name))
{
context.Result = new ForbidResult();
}
}
}
}
[MyAuthorize]
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
return View();
}