Проверка авторизации пользователя или роли - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть вопрос об авторизации.

Скажите, что у меня есть конечная точка, такая как: / users / {id} / password

Скажите, что это почтовый запрос и вы можете изменитьпароль для конкретного пользователя.

Существует ли способ авторизовать / разрешить использование этой конечной точки только тем, кто в данный момент вошел в систему, или любому пользователю, который имеет определенную роль.(Эта информация доступна в требовании токена доступа)

Правильно ли это, может быть, в первую очередь может возникнуть вопрос ...

Если это так, то я понимаю, что есть обе базы ролейи авторизация на основе утверждений, поскольку они (из того, что я вижу) используют конкретные значения, которые они проверяют.Таким образом, это будет работать с ролями, но не с идентификатором пользователя, так как он динамический и не может записать все идентификаторы для проверки при создании, например, полоцитов.

Мне нужно проверить идентификатор пользователя запроса поидентификатор пользователя токена, чтобы проверить, авторизованы ли они для использования конечной точки.Если нет, то они админ?Если с ними все в порядке, они не являются целевым пользователем, они могут изменить его в любом случае.

Также я не могу найти какие-либо примеры двух разных наборов авторизации, используемых в одном или / или обстоятельствах (например, какздесь вы можете использовать его, если вы являетесь пользователем, на которого он нацелен, или администратором)

В настоящее время я решаю эту проблему в своей конечной точке, выбирая удостоверения и проверяя заявки вручную.

var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;
var userDataClaim = claims.Where(x => x.Type == ClaimTypes.UserData).FirstOrDefault();
var roleClaim = claims.Where(x => x.Type == ClaimTypes.Role).FirstOrDefault();

if(Convert.ToInt32(userDataClaim.Value) != id && roleClaim.Value != "1")
{
    return Unauthorized();
}

Нет ли лучшего способа сделать это.Я не хотел бы связывать все мои функции конечной точки с такой проверкой.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

if (userId = currentUser) {получить userInfo от чьего токена доступа} else {получить информацию администратора пользователя из базы данных} я предложу промежуточное программное обеспечение для этого.Вам нужна роль авторизации и получите userInfo. Я предлагаю создать для нее новый сервис.

0 голосов
/ 12 декабря 2018

Вам нужно будет создать свой собственный атрибут авторизации.Это довольно просто, и если вы только настраиваете его для проверки текущего зарегистрированного пользователя, вы можете использовать то же определение AuthorizeAttribute.Взгляните на это .(AuthorizeAttribute.cs)

protected virtual bool IsAuthorized(HttpActionContext actionContext)
        {
            if (actionContext == null)
            {
                throw Error.ArgumentNull("actionContext");
            }

            IPrincipal user = actionContext.ControllerContext.RequestContext.Principal;
            if (user == null || user.Identity == null || !user.Identity.IsAuthenticated)
            {
                return false;
            }

            if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
            {
                return false;
            }

            if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole))
            {
                return false;
            }

            return true;
        }

Если вы хотите проверить соответствие заявкам, вы можете изменить IsAuthorized и сделать это следующим образом:

var principal = actionContext.RequestContext.Principal as ClaimsPrincipal;

            if (!principal.Identity.IsAuthenticated)
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
                return Task.FromResult<object>(null);
            }

            if (!(principal.HasClaim(x => x.Type == ClaimType && x.Value == ClaimValue)))
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
                return Task.FromResult<object>(null);
            }

            //User is Authorized, complete execution
            return Task.FromResult<object>(null);
0 голосов
/ 12 декабря 2018

Вы можете добавить это до своей конечной точки следующим образом.

[Authorize(Roles = "admin")]

Кроме того, чтобы сделать проверку Роли необязательной, вы должны наследовать класс System.Web.Http.AuthorizeAttribute и также переопределить HandleUnauthorizedRequest, и в этом методе вы можете добавить несколько собственных проверок, которые вы хотели бы добавить в каждую конечную точку.

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