1

Я пытаюсь получить голову из облаков с сервером идентификации.Выбор и реализация клиента идентификационного сервера идентификации Thinktecture

Я хотел бы реализовать проект сервера идентичности позволить аутентификации

  1. An ASP.NET MVC 5 приложений
  2. ASP.NET Web API реализация
  3. окна обслуживания

Int this blog post Я прочитал некоторые подробности о клиентах. Автор просто заявляет:

OAuth 2 предоставляет несколько типов «грантов» для разных вариантов использования. В типы грантов определены следующие:

  1. код авторизации для приложений, работающих на веб-сервере
  2. неявной для браузерных или мобильных приложений
  3. Пароль для входа в систему с именем пользователя и паролем
  4. учетные данные клиента для доступа к приложениям

В чем разница между Кодексом авторизации и неявным? Это означает, что подразумеваемые должны использоваться, например, кодом javascript?

Правильнее сказать, что мне нужно:

  1. безвозмездному предоставлению пароля для приложения ASP.NET MVC
  2. учетные данные клиента для Web API
  3. Код авторизации для службы Windows?

Еще один вопрос, я хотел бы реализовать авторизацию в своем веб-api, основанном либо на знаке носителя, либо на простом apiKey. Могут ли оба типа cohesist? Как реализовать apiKey с помощью сервера Identity?

Большое спасибо и извините, если это глупые вопросы.

ответ

4

Я старался изо всех сил, чтобы этот ответ короткий (но я был вынужден добавить много контекста, чтобы иметь смысл ответа)

конфиденциального против публичных клиентов

Клиенты (приложение запрашивает доступ от вашего имени - приложение 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. Клиент надежно хранит его.

enter image description here

неявный грант

Oauth2 Spec Определяет неявный грант как:

«неявный тип гранта используются для получения маркеров доступа (он не поддержки ВЫДАЧИ токенов обновления) и оптимизирован для публичных клиентов, которые, как известно, управляют определенным URI перенаправления. Эти клиенты обычно реализуются в браузере, используя язык сценариев, такой как как JavaScript.

Поскольку это перенаправление на основе потока, клиент должен быть способен взаимодействовать с владельца ресурса User-Agent (обычно веб-браузер) и способный принимать входящие запросы (через перенаправление) с сервера авторизации ,

В отличии от авторизации типа кода гранта, в котором клиент делает отдельные запросов на разрешение и на маркер доступа, клиент получает маркер доступа в качестве результата запроса авторизации.

Неявный тип гранта не включает аутентификацию клиента, а зависит от наличия владельца ресурса и регистрации URI перенаправления. Поскольку маркер доступа кодируется в перенаправления URI, он может быть подвержен владельцу ресурса и других приложений, размещенным на одном устройстве»

enter image description here

Разницы между кодом авторизации и неявным?

Таким образом, основная разница в том:

  • В неявном гранте, клиент не делает отдельный запроса для авторизации и доступа маркеров.
  • Оба разрешения и маркер доступа передаются ресурс-владельцу, закодированный в переадресовать 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. Я уверен, что Брок/Доминик должен быть в состоянии подтвердить.

+0

Большое спасибо за объяснение. Большинство облаков теперь исчезло. Я попытаюсь более подробно описать свой запрос об apiKey в редактировании или другом вопросе. Еще раз большое спасибо. – Lorenzo

+1

Или http://leastprivilege.com/2016/01/17/which-openid-connectoauth-2-o-flow-is-the-right-one/ – leastprivilege

+0

@Lorenzo - Рад, что помогло. @ lessprivilege - Спасибо! – Karthik