Как идентифицировать вызывающего абонента, когда Grant_type равен client_credentials?

У меня есть веб-приложение ASP.NET, и я использую IdentityServer3 для аутентификации пользователя. Наши клиенты входят в веб-приложение, используя идентификатор пользователя/пароль. Теперь у меня есть еще один веб-API, и некоторым нашим клиентам нужно вызывать этот веб-API из своих приложений. (связь сервер-сервер). Итак, основываясь на это, в identityserver я сделал следующее

1> Создано новое имя области api
2> Создан новый клиент для веб-API и настроены с разрешенной областью api и offline_access
3> Установите для потока значение ClientCredentials
4> Установите для AccessTokenType значение Jwt
5 > Для каждого клиента я создал свой секретный ключ

Теперь наши клиенты могут получить токен доступа в конечной точке connect/token, а затем выполнить вызов API, используя токен доступа. API проверяет токен с помощью IdentityServer, а затем возвращает результат. Все хорошо до сих пор.

Однако в проекте API мне также нужно идентифицировать customer, также известный как caller. Основываясь на клиенте, мне нужно сделать некоторую логику

public class ResourcesController : ApiController
{
    public IHttpActionResult Get()
    {            
        var caller = User as ClaimsPrincipal;
        // need to identify caller here
        return Json(new
        {
            message = "OK",
        });
    }
}

(Одним из вариантов, который я могу придумать, является использование идентификатора клиента как части URL-адреса API. Что-то вроде http://api.domain.com/v1/customerid/resources)

Есть ли способ использовать IdentityServer для идентификации клиента?


person LP13    schedule 27.12.2018    source источник


Ответы (1)


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

AlwaysSendClientClaims = true,                     
Claims = new List<Claim>()
{
  new Claim("CustomerId", "0121021") 
}

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

public class ResourcesController : ApiController
{
    public IHttpActionResult Get()
    {            
        var caller = User as ClaimsPrincipal;

        // need to identify caller here
        var customerId = caller?.Claims.Where(p => p.Type.Equals("CustomerId")).First().Value;
        // need to identify caller here

        return Json(new
        {
            message = "OK",
        });
    }
}
person Vidmantas Blazevicius    schedule 28.12.2018
comment
client в identityserver на самом деле является приложением, в данном случае мой api является клиентом. Итак, у меня есть только один client на сервере идентификации. У меня нет нескольких клиентов для каждого вызывающего абонента. а для api клиента я добавил разные secret key для каждого вызывающего абонента - person LP13; 28.12.2018
comment
@LP13 Тогда это неправильно. Вы неправильно понимаете поток учетных данных OAuth и клиента. API — это ресурс, а объект, обращающийся к этому ресурсу, — это клиент. Вам нужно иметь клиента для каждого клиента, а не секрет для одного и того же клиента для каждого клиента. - person Vidmantas Blazevicius; 28.12.2018