Как сделать пользовательские заявки доступными в запросах API - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть решение, состоящее из:

  • ASP.NET Core 2.1 под управлением IdentityServer4 поверх ASP.NET Identity Core.
  • Веб-API ASP.NET Core 2.1 установлен наиспользуйте IdentityServer в качестве поставщика аутентификации.
  • Веб-приложение React SPA, использующее oidc-client библиотеку javascript.

При создании новых пользователей я устанавливаю несколько пользовательских утверждений, которые сохраняются вAspNetUserClaims таблица, которая выглядит следующим образом: enter image description here

Затем в моем проекте API внутри контроллера я хочу получить эти пользовательские утверждения аутентифицированного пользователя.
Iожидал, что this.User.Claims получит мне их, но вместо этого он возвращает следующее, что, похоже, относится к претензиям, связанным с клиентским приложением, а не с пользователем.

enter image description here

Как я могу получить доступ к этим пользовательским утверждениям (address, location, tenant_role) из контроллера внутри проекта Web API?
Не забывайте, что у проекта API нет доступа к классу UserManager или чему-либо еще ASP.NET Identity Core относящиеся.

Ответы [ 4 ]

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

Итак, я заказываю, чтобы мое пользовательское утверждение было доступно в каждом запросе API, который мне приходилось делать при настройке ApiResource при запуске IdentityServer.

//Config.cs
public static IEnumerable<ApiResource> GetApiResources()
{
    ApiResource apiResource = new ApiResource("api1", "DG Analytics Portal API")
    {
        UserClaims =
        {
            JwtClaimTypes.Name,
            JwtClaimTypes.Email,
            AnalyticsConstants.TenantRoleClaim // my custom claim key/name
        }
    };

    return new List<ApiResource>
    {
        apiResource
    };
}

Этот метод пропущенна services.AddInMemoryApiResources (или на любой другой способ хранения, который вы используете)

IIdentityServerBuilder builder = services
                .AddIdentityServer(options =>
                {
                    options.Events.RaiseErrorEvents = true;
                    options.Events.RaiseInformationEvents = true;
                    options.Events.RaiseFailureEvents = true;
                    options.Events.RaiseSuccessEvents = true;
                })
                .AddInMemoryIdentityResources(Config.GetIdentityResources())
                .AddInMemoryApiResources(Config.GetApiResources()) // here
                .AddInMemoryClients(Config.GetClients())
                .AddAspNetIdentity<ApplicationUser>();

При такой настройке при каждом обращении к конечной точке API появляется мое пользовательское требование TenantRole, поэтому я могу просто сделать User.FindFirst(AnalyticsConstants.TenantRoleClaim) чтобы получить это.

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

Я написал этот расширитель для использования в MVC 5, но, поскольку он использует http-контекст и безопасность системы (а не User Manager или Identity), я предполагаю, что внутреннее устройство этого будет работать на MVC6

public static bool UserHasSpecificClaim(this HtmlHelper h, string claimType, string claimValue)
{
    // get user claims
    var user = HttpContext.Current.User as System.Security.Claims.ClaimsPrincipal;

    if (user != null)
    {
        // Get the specific claim if any
        return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
    }

    return false;
}
0 голосов
/ 10 декабря 2018

Вам нужно будет определить ресурсы и области идентификаторов а-ля:

http://docs.identityserver.io/en/latest/topics/resources.html

И затем убедитесь, что они предоставляются вашей реализацией IProfileService или IClaimsService на вашем сервере идентификации:

http://docs.identityserver.io/en/latest/reference/profileservice.html

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

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

Вы можете использовать ClaimsPrincipal.FindFirst() для доступа к своим индивидуальным заявкам.

Документ: https://docs.microsoft.com/en-us/dotnet/api/system.security.claims.claimsprincipal.findfirst?view=netcore-2.1

Пример: User.FindFirst("your_claim_key").Value

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