Я старался изо всех сил, чтобы этот ответ короткий (но я был вынужден добавить много контекста, чтобы иметь смысл ответа)
конфиденциального против публичных клиентов
Клиенты (приложение запрашивает доступ от вашего имени - приложение MVC, SPA и т. д.) классифицируются как конфиденциальные и публичные клиенты на основе их способности безопасно аутентифицироваться с сервера авторизации (в нашем случае Identity Server).
Например, веб-приложение (приложение MVC) считается конфиденциальным клиентом, поскольку оно реализовано на защищенном сервере и способно обеспечить безопасную аутентификацию клиента на сервере авторизации (через обратный канал - без участия пользовательского агента или общедоступного канала). Кроме того, он может хранить секретные маркеры (в основном учетные данные клиента, access_token и токен обновления), которые защищены от доступа общего доступа (например,пользователем-агентом/владельцем ресурса)
Принимая во внимание, что приложения на основе пользовательского агента (SPA) и собственные приложения (мобильные приложения) считаются публичными клиентами. Это связано с тем, что данные протокола и учетные данные клиента легко доступны владельцу ресурса.
Код авторизации Грант
Oauth2 Spec Определяет код авторизация Грант как:
«Разрешение кода типа грант используется для получения как доступ маркеров и обновления маркеров и оптимизирован для конфиденциальных клиентов. Поскольку это поток на основе перенаправления, клиент должен иметь возможность взаимодействовать с пользовательским агентом владельца ресурса (обычно это веб-браузер ) и способен принимать входящие запросы (через перенаправление) с сервера авторизации. "
Это просто означает, что поток авторизационного кода оптимизирован для конфиденциального клиента, взаимодействующего с владельцем ресурса с помощью пользовательского агента (браузера), способного принимать и перенаправлять входящие запросы с сервера Auth Server (Identity Server).
В абстрактных терминах - поток кода авторизации имеет следующую последовательность,
- Ресурс-владелец проверяет подлинность (через -user агента) с разрешения сервером и получает authorization_code
- Ресурс-владелец предоставляет Authorization_code к Клиент (через пользователь-агент после перенаправления с Сервер авторизации)
- Клиент аутентифицируется на сервере авторизации (через запрос обратного канала) и обменивается авторизационным кодом для доступа access_token
- access_token хранится в клиенте и ресурс-владелец перенаправляется на соответствующий ресурс
- Поскольку клиент (MVC App) имеет access_token, он может запросить Refresh знак с сервера авторизации (при необходимости).
- Один важный момент - в потоке кода авторизации Владелец ресурса никогда не может видеть (или иметь доступ) Access_token. Клиент надежно хранит его.
неявный грант
Oauth2 Spec Определяет неявный грант как:
«неявный тип гранта используются для получения маркеров доступа (он не поддержки ВЫДАЧИ токенов обновления) и оптимизирован для публичных клиентов, которые, как известно, управляют определенным URI перенаправления. Эти клиенты обычно реализуются в браузере, используя язык сценариев, такой как как JavaScript.
Поскольку это перенаправление на основе потока, клиент должен быть способен взаимодействовать с владельца ресурса User-Agent (обычно веб-браузер) и способный принимать входящие запросы (через перенаправление) с сервера авторизации ,
В отличии от авторизации типа кода гранта, в котором клиент делает отдельные запросов на разрешение и на маркер доступа, клиент получает маркер доступа в качестве результата запроса авторизации.
Неявный тип гранта не включает аутентификацию клиента, а зависит от наличия владельца ресурса и регистрации URI перенаправления. Поскольку маркер доступа кодируется в перенаправления URI, он может быть подвержен владельцу ресурса и других приложений, размещенным на одном устройстве»
Разницы между кодом авторизации и неявным?
Таким образом, основная разница в том:
- В неявном гранте, клиент не делает отдельный запроса для авторизации и доступа маркеров.
- Оба разрешения и маркер доступа передаются ресурс-владельцу, закодированный в переадресовать URI
- Это приводит к уязвимости безопасности, описанной здесь https://tools.ietf.org/html/rfc6749#section-10.16
- В связи с этими последствиями для безопасности, с помощью архитектуры освежать маркер не будут выдается государственным клиентам (которые не способны поддерживать клиента в секрете, поэтому access_token и обновить маркер)
ли это означает, что неявное должен быть использован, например, с помощью яваскрипта кода?
Да. Из-за вышеперечисленных подробностей и в качестве обычной практики большинство JS/SPA используют неявный поток Oauth2 для защиты приложения.
() Чтобы избежать путаницы, пропустите эту часть. Существует несколько вариантов этого неявного потока. В целом характеристики Oauth2 являются текучими по своей природе, что приводит нас к нескольким гибридным/пользовательским реализациям, построенным по строкам рекомендаций Oauth2. -connect решить некоторые из проблем, и относительно новых (и зрелый) спецификация построена на вершине oauth2)
субсидия пароль для ASP.NET MVC приложения -
грант Пароль предназначается для использоваться в сценарии, когда владелец ресурса имеет сильные доверительные отношения с клиентом (например, собственные приложения). Для этого варианта использования рекомендуемым типом субсидирования будет поток кода авторизации.
учетные данные клиента для Web API -
Вы правы. Тип предоставления мандатов клиентов используется, когда само приложение также является владельцем ресурса
Код авторизации для службы Windows?
В связи с вышеизложенными причинами в спецификации (требование перенаправления пользовательского агента и т. Д.) Ввод кода авторизации здесь не подходит. В зависимости от типа услуг Windows я бы использовал либо учетные данные клиента, либо тип предоставления пароля
Может ли оба типа cohesist? Как реализовать apiKey с помощью сервера Identity ?
Я не уверен на 100% о вашем требовании здесь. Но если вы могли бы опубликовать несколько подробностей и информацию о том, чего хотите достичь here. Я уверен, что Брок/Доминик должен быть в состоянии подтвердить.
Большое спасибо за объяснение. Большинство облаков теперь исчезло. Я попытаюсь более подробно описать свой запрос об apiKey в редактировании или другом вопросе. Еще раз большое спасибо. – Lorenzo
Или http://leastprivilege.com/2016/01/17/which-openid-connectoauth-2-o-flow-is-the-right-one/ – leastprivilege
@Lorenzo - Рад, что помогло. @ lessprivilege - Спасибо! – Karthik