Как я могу получить роль пользователя из БД для заполнения AuthorizeAttribute - PullRequest
0 голосов
/ 20 мая 2019

У меня есть приложение .netcore mvc, в котором у меня есть роли в классе CustomRoles:

public class CustomRoles
    {
       ///<Summary>Manager role</Summary>
       public const string Manager = "Manager";

       ///<Summary>Publisher role </Summary>
       public const string Publisher = "Publisher";
    }

В моем контроллере я устанавливаю разрешение на конечную точку:

    /// <summary>
    /// ASYNC Version: Get a List of Journals based on a Week Id
    /// </summary>
    /// <param name="weekId">Database unique Week ID</param>       
    /// <response code="204">No Content</response>
    /// <response code="400">Bad Request</response> 
    /// <returns></returns>
    [Authorize(Roles = CustomRoles.Manager +","+ CustomRoles.Publisher)]
    [HttpGet("GetPartnerJounalsByIdAsync/")]
    [ProducesResponseType(200, Type = typeof(JounalsPartnerGetResponse))]
    [ProducesResponseType(204)]
    [ProducesResponseType(400)]
    public async Task<ActionResult> GetPartnerJournalsByIdAsync([Required]int weekId)
    {
        //get from db
    }

Я хочу заполнить роли из базы данных, а не жестко кодировать их в классе, поэтому я могу добиться этого:

[Authorize (Roles = //Roles from the database)]

Вот решение, которое я создал, но я застрял.Я реализовал класс ролей:

 public class Role
    {
        /////<Summary>Manager role</Summary>
        public string 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;
    }

Есть идеи, как мне этого добиться?

1 Ответ

1 голос
/ 21 мая 2019

Для проверки роли на основе данных в базе данных вы можете реализовать свой собственный 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();
            }
        }
    }
}

и использовать его как:

[MyAuthorize]
public IActionResult About()
{
    ViewData["Message"] = "Your application description page.";

    return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...