Что ожидает ClaimsPrincipal.IsInRole в заявке? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть претензия groups. Когда я настраиваю свой TokenValidationParameters, я устанавливаю RoleClaimType равным groups.

Когда претензии удовлетворяются, претензия groups имеет такое значение:

«что-то, что-то другое, больше вещей, другие вещи»

Но когда я звоню:

User.IsInRole("some other thing");

В результате получается False.

Что IsInRole ожидает в этом утверждении?

Значение означает, что требуется разделение точкой с запятой, разделение запятыми (которое, кажется, не работает), разделение пробелом или одно значение (не убедитесь, что это может быть проверка "in", если это одно значение.)

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

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

public class AzureAdGroupsSplitClaimTransformation : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var identities = principal.Identities;
        if (identities == null)
        {
            return Task.FromResult(principal);
        }

        var result = new List<ClaimsIdentity>();
        var groupsClaimSplit = false;

        // Iterate each identity the user may have, make sure to keep all of them
        foreach (var identity in identities)
        {
            var groupClaims = identity.FindAll("groups").ToList();
            if (groupClaims.Count != 1 || !groupClaims[0].Value.Contains(','))
            {
                // groupClaims.Count == 0: Identity does not have groups
                // groupClaims.Count > 1: Identity has more than one groups claim, already split
                // The only groups claim does not contain a comma: Identity has one group, no need to split
                result.Add(identity);
                continue;
            }

            var claim = groupClaims[0];
            var groups = claim.Value.Split(',', StringSplitOptions.RemoveEmptyEntries);
            var claims = groups.Select(s => new Claim("groups", s));
            var updatedIdentity = new ClaimsIdentity(identity, claims);
            result.Add(updatedIdentity);

            groupsClaimSplit = true;
        }

        // Nothing was done to the original identities, may as well just return the original principal
        if (!groupsClaimSplit)
        {
            return Task.FromResult(principal);
        }

        return Task.FromResult(new ClaimsPrincipal(result));
    }
}

, а затем зарегистрировать его в коллекции служб:

services.AddSingleton<IClaimsTransformation, AzureAdGroupsSplitClaimTransformation>();

Теперь вы должны получить дополнительные групповые утверждения для пользователя с помощью только одно значение. Ваша проверка роли должна сработать. Хотя для этой цели немного странно использовать IsInRole, вы также можете использовать User.HasClaim("groups", "your-group-id").

0 голосов
/ 23 апреля 2020

Вы пытаетесь использовать утверждения, но проверяете их с помощью метода role.

Что ожидает IsInRole в этом утверждении?

Метод

User.IsInRole(roleName) проверяет, имеет ли User указанную роль roleName в приложении.

Фактическая структура метода выглядит следующим образом:

public bool IsInRole (string role);

Так что "some other thing" должно быть зарегистрировано role в вашем приложении, а User должно быть предоставил эту роль для того, чтобы метод возвратил true.

Вы можете прочитать больше здесь

...