Как я могу получить пользователя из моего AuthorizationAttribute из приложения ASPNETCORE 2.2? - PullRequest
0 голосов
/ 12 января 2019

Я создал собственный атрибут, который хотел бы украсить свой контроллер API внутри моего углового приложения ASPNETCORE. Я могу настроить свою аутентификацию в соответствии с требованиями и войти в приложение из логина. Затем я украшаю свой метод API своим собственным атрибутом.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false)]
public class ManageAuditAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    public List<Claim> Claims { get; set; }
    public ManageAuditAttribute(String feature)
    {
        Feature = feature;
    }
    public bool IsAuthorized()
    {
      // TODO check there is a claim for the given feature
    }
    private String Feature { get; }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var accessor = (IHttpContextAccessor)context.HttpContext.RequestServices.GetService(typeof(IHttpContextAccessor));
        var name = context.HttpContext.User.FindFirst(ClaimTypes.Email); //NULL
        var user = context.HttpContext.User; // NULL
        var userName = Thread.CurrentPrincipal.Identity.Name; // NULL
    }
}

Прежде чем сказать, что заявки не используются таким образом, я бы добавил, что мне нужно встроить это в унаследованную систему, которая имеет список разрешенных функций. Я добавляю эти функции пользователю как претензии и проверяю, что претензии существуют для каждого пользователя. Значение для фактической заявки - это имя приложения, для которого требуется заявка.

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

Я могу получить пользователя, но имя всегда пусто, и мой список заявок также пуст. Это как если бы я не вошел в систему вообще. Даже после входа в систему.

1 Ответ

0 голосов
/ 14 января 2019

Для получения имени, вы должны передать ClaimTypes.Name вместо ClaimTypes.Email, как

var user = context.HttpContext.User.FindFirst(ClaimTypes.Name);

Или вы можете получить HttpContext.User.Identity.Name как

var userName = context.HttpContext.User.Identity.Name;
...