IdentityServer4 в качестве веб-API - PullRequest
0 голосов
/ 12 марта 2019

Я новичок в IdentityServer4. Сейчас я пытаюсь реализовать микросервисы с JWT-авторизацией (передавая токены каждому запросу в API). Таким образом, схема является примитивной - сервер IDS4 в качестве сервера аутентификации, ASP.NET Identity + MSSQL для использования и хранения клиентских данных, другие службы используют службу аутентификации для проверки токена. Итак, я просмотрел много статей, но не нашел ни одного примера, где я мог бы настроить поведение IDS4. Например, я хочу, чтобы клиент вызвал AuthorizeByLogin(AuthorizeView model) метод API, реализованный в проекте IDS4, где модель - это объект из 2 полей: Username, Password. В этом методе я хочу проверить пользователя в базе данных и сгенерировать access_token, который передается клиенту для работы с защищенным API. Но нигде нет примера, как это сделать (вызвать метод API, передать объект и получить токен). В большинстве случаев написано «используйте для этого * / connect / token».

Может ли кто-нибудь дать мне пример кода, в котором этот способ реализован хорошо? Или, может быть, скажите мне, какие интерфейсы я должен реализовать и правильно передать службам в приложении ASP.NET Core для аутентификации Web API + реализации IdentityServer4?

Спасибо.

1 Ответ

1 голос
/ 12 марта 2019

Вы можете найти множество примеров быстрого запуска в Identity Server 4 GitHub .Кроме того, насколько я понимаю, вы хотите использовать ResourceOwnerCredentials тип предоставления.Вы не сможете легко изменить конечные точки, которые выдают токены, без переопределения большинства Identity Server 4, но вы можете реализовать интерфейс IResourceOwnerPasswordValidator и настроить клиент с соответствующим разрешенным типом предоставления:

    new Client
    {
        ClientId = "your_client",
        AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,

        ClientSecrets =
        {
            new Secret("your_password".Sha256())
        },
        AllowedScopes = { ... }
    }

После этого клиенты могут вызвать конечную точку connect\token, указав имя пользователя и пароль для данного пользователя вместе со своими учетными данными:

var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = "ro.client",
    ClientSecret = "secret",

    UserName = "alice",
    Password = "password",
    Scope = "api1"
});
...