Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从DB获取用户角色以填充authorized属性_C#_Asp.net Core_Authorization_Microservices_Roles - Fatal编程技术网

C# 如何从DB获取用户角色以填充authorized属性

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

我有一个.netcore mvc应用程序,其中我有CustomRoles类中的角色:

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();
}