Централизованная конечная точка авторизации и аутентификации с использованием AspNet.Security.OpenIdConnect.Server (OIDC)

Я использую Visual Studio 2015 Enterprise Update 1 и ASP.NET 5 rc1-final для создания конечной точки, которая одновременно выдает и потребляет токены JWT, как подробно описано здесь. В этом подходе у нас есть один проект, который «делает все это» - проект использует OIDC для выдачи токенов, аутентификацию носителя JWT для их проверки, а затем защищает доступ к различным контроллерам с помощью атрибута Authorize - все в одном проекте.

Теперь мы хотели бы реорганизовать это решение, создав конечную точку авторизации и аутентификации OIDC, которая только выдает и проверяет токены. Затем нам нужно n дополнительных конечных точек, которые полагаются на эту конечную точку OIDC в ​​качестве центрального органа для аутентификации токенов. Это позволит нам установить дополнительные конечные точки на нашей растущей магистрали службы без необходимости кодировать авторизацию и аутентификацию для каждой конечной точки.

Хотя я понимаю, как настроить OIDC для выдачи токенов с одной конечной точки, не совсем понятно, как я буду указывать мою другую конечную точку на конечную точку OIDC для аутентификации токена. В настоящее время аутентификация JWT и OIDC одновременно настраиваются в методе «Configure» промежуточного программного обеспечения, поэтому я предполагаю, что, возможно, на всех подчиненных сайтах у меня будет небольшой фрагмент кода при вызове app.UseJwtBearerAuthentication, просто указывающий промежуточное ПО JWT на конечную точку OIDC? Если это так, с app.UseJwtBearerAuthentication, который использует OIDC, чтобы позволить IdentityModel использовать HTTP, все еще происходит немного волшебства, поэтому я не понимаю, понадобится ли мне это и на подчиненных серверах.

Мы будем очень благодарны за любые советы о том, как установить единую конечную точку авторизации и аутентификации OIDC, а затем иметь n подчиненных конечных точек, указывающих на эту конечную точку для аутентификации токенов JWT.


person 42vogons    schedule 21.12.2015    source источник


Ответы (1)


Разделение роли сервера ресурсов (то есть API) от роли сервера авторизации определенно возможно с помощью ASOS.

При выборе токенов JWT (вместо зашифрованных токенов по умолчанию) вам необходимо убедиться, что аудитория правильно добавлена ​​к билету аутентификации, вызвав ticket.SetResources, чтобы токен доступа JWT получил соответствующее aud утверждение, содержащее идентификатор, связанный с вашим сервером ресурсов. (т.е. API):

public override Task GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsContext context) {
    var identity = new ClaimsIdentity(context.Options.AuthenticationScheme);
    identity.AddClaim(ClaimTypes.NameIdentifier, "[unique identifier]");

    var ticket = new AuthenticationTicket(
        new ClaimsPrincipal(identity),
        new AuthenticationProperties(),
        context.Options.AuthenticationScheme);

    // Call SetResources with the list of resource servers
    // the access token should be issued for.
    ticket.SetResources("resource_server_1");

    // Call SetScopes with the list of scopes you want to grant.
    ticket.SetScopes("profile", "offline_access");

    context.Validate(ticket);

    return Task.FromResult(0);
}     

В вашем приложении API вам просто нужно установить свойство options.Audience с идентификатором, используемым на сервере авторизации, и оно должно работать:

app.UseJwtBearerAuthentication(new JwtBearerOptions {
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    Audience = "resource_server_1",
    Authority = "http://localhost:61854"
});

У меня был бы небольшой фрагмент кода при вызове app.UseJwtBearerAuthentication, просто указывая промежуточное ПО JWT на конечную точку OIDC? Если это так, с app.UseJwtBearerAuthentication, который использует OIDC, чтобы позволить IdentityModel использовать HTTP, все еще происходит немного волшебства, поэтому я не понимаю, понадобится ли мне это и на подчиненных серверах.

По промежуточного слоя носителя JWT автоматически получает криптографический ключ, используемый для подписи токена доступа, с сервера авторизации, указанного в свойстве options.Authority, путем HTTP-вызова конечной точки метаданных конфигурации: вам не нужно ничего настраивать, даже если проект API отделен от приложения сервера авторизации .

person Kévin Chalet    schedule 25.12.2015
comment
Отлично, @Pinpoint - я попробую. Также следует ли в будущих публикациях ссылаться на AspNet.Security.OpenIdConnect.Server как на ASOS? - person 42vogons; 28.12.2015
comment
И то, и другое в порядке, но я думаю, что длинное имя лучше с точки зрения SEO;) К вашему сведению, я создал новый тег aspnet-contrib (таким образом, я могу получать уведомление, когда вопрос публикуется с этим тегом), так что не сомневайтесь чтобы добавить его, задавая вопрос об ASOS. - person Kévin Chalet; 28.12.2015
comment
Я подключил это к своей существующей реализации, чтобы любые новые API могли указывать на мою существующую конечную точку в качестве сервера ресурсов. Теперь вопросы; o) 1) Некоторое время назад я начал добавлять ключ ресурса в форму запроса токена со значением, установленным в URL-адрес сервера ресурсов. Это все еще требуется? 2) Кроме того, проверка моей настраиваемой аудитории прервалась, потому что я использовал классы URI для надежного сравнения значений URI «aud» - могу ли я убрать это сейчас, когда «aud» заполнено именем в свободной форме? - person 42vogons; 28.12.2015
comment
И для чего нужны прицелы? Спасибо! - person 42vogons; 28.12.2015
comment
Начиная со следующей бета-версии, параметр resource больше не будет поддерживаться OTB, поэтому его использование больше не рекомендуется (вызов ticket.SetResources теперь является официальным подходом). Вы все равно должны иметь возможность использовать URI, если вам не нравится использовать строковый идентификатор. - person Kévin Chalet; 28.12.2015
comment
Что касается объема, не стесняйтесь взглянуть на официальное определение: tools.ietf. org / html / rfc6749 # section-3.3. Если вы не заботитесь о том, чтобы клиентские приложения могли получать токен обновления или получать доступ к утверждениям профиля, вы можете проигнорировать это. - person Kévin Chalet; 28.12.2015
comment
К вашему сведению, мы перестанем использовать JWT в качестве формата по умолчанию для токенов доступа в следующей бета-версии: не пропустите этот билет для получения дополнительной информации о различных последствиях. - person Kévin Chalet; 28.12.2015
comment
Считается ли приемлемым иметь разную аудиторию для каждой среды, например (dev_resource_server_1, test_resource_server_1, prod_resource_server_1)? Похоже, это хорошо работает для нас, поскольку запрещает использование токенов в разных средах. - person 42vogons; 29.12.2015
comment
Я не понимаю, почему это было бы неприемлемо. Вы в основном ограничены только своим воображением :) - person Kévin Chalet; 29.12.2015
comment
Обновлено для использования нового синтаксиса ASOS beta5. - person Kévin Chalet; 19.05.2016