2015-12-21 2 views
1

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

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

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

Любые советы о том, как установить единую авторизацию OIDC &, а также конечные точки аутентификации «n» указывают на то, что конечная точка для аутентификации токенов JWT будет очень оценена.

ответ

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 собственности, by making an HTTP call to the configuration metadata endpoint: вам не нужно ничего настраивать, даже если проект API отделен с сервера авторизационного приложения.

+0

Awesome, @Pinpoint - Я сделаю это. Также должен ли я ссылаться на AspNet.Security.OpenIdConnect.Server как ASOS в будущих сообщениях? – 42vogons

+0

Оба прекрасны, но я думаю, что длинное имя лучше с точки зрения SEO;) FYI, я создал новый тег 'aspnet-contrib' (таким образом, я могу получать уведомление, когда вопрос отправляется с этим тегом) поэтому не стесняйтесь добавлять его, задавая вопрос ASOS. – Pinpoint

+0

Я связал это с моей существующей реализацией «все это», поэтому любые новые API-интерфейсы могут указывать на мою существующую конечную точку в качестве сервера ресурсов. Теперь вопросы: o) 1) Некоторое время назад я начал добавлять ключ ресурса в форму запроса токена со значением, установленным на URL-адрес сервера ресурсов. Это все еще требуется? 2) Также моя выборочная проверка аудитории нарушилась, потому что я использовал классы URI для надежного сравнения значений URI «aud». Могу ли я принять это сейчас, когда «aud» заполняется со свободной формой? – 42vogons

Смежные вопросы