Как сопоставить значение утверждения поставщика удостоверений с поставщиком удостоверений, зарегистрированным в Azure ACS?

Azure позволяет нам получить список зарегистрированных поставщиков удостоверений, получив:

https://YourNamespace.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?
    protocol=wsfederation&
    realm=YourAppRealm&
    reply_to=YourAppReturnURL&
    version=1.0

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

Проблема в том, что ресурс IdentityProvider.js не сообщает нам, какое утверждение поставщика удостоверений будет использоваться.

Например:

  • Windows Live ID использует значение утверждения uri:WindowsLiveID
  • Google использует значение утверждения Google
  • Поставщик удостоверений ADFS может использовать значение утверждения, например http://adfs.mycompany.com/adfs/services/trust.

Мне нужно иметь возможность сопоставлять значения утверждения поставщика удостоверений и поставщиков удостоверений, перечисленных IdentityProviders.js.

Причина этого в том, что мне нужно разрешить назначать разрешения пользователям, идентифицированным конкретным поставщиком удостоверений. Чтобы упростить пользователю задачу, я хочу предоставить ему список поставщиков удостоверений на выбор (т. е. представляя данные, полученные из IdentityProviders.js). Однако фактическое назначение должно быть выполнено с использованием значения утверждения поставщика удостоверений, поскольку именно оно идентифицирует поставщика.

Это возможно? Есть ли обходные пути?

Любая помощь будет оценена по достоинству!


person Mårten Wikström    schedule 25.06.2013    source источник
comment
Интересный вопрос! Просто мысли вслух. Поскольку вы настраиваете поставщиков удостоверений, разрешенных через ACS (или, другими словами, произвольные провайдеры удостоверений не разрешены), не можете ли вы сохранить это сопоставление в своей базе данных? Таким образом, если значение утверждения возвращается как uri:WindowsLiveID, вы можете сопоставить его с Windows Live ID в своей базе данных.   -  person Gaurav Mantri    schedule 25.06.2013
comment
Да, это было бы возможно. Однако я разрабатываю платформу, на которой размещено несколько отдельных экземпляров (баз данных), и я хочу минимизировать объем работы, который необходимо выполнить для инициализации/настройки каждого экземпляра. Все/многие экземпляры используют одно и то же пространство имен ACS, поэтому было бы хорошо, если бы я мог, например, добавить нового поставщика удостоверений в ACS без необходимости настраивать каждый экземпляр только для этого сопоставления...   -  person Mårten Wikström    schedule 25.06.2013
comment
Посмотрите, поможет ли этот подход: stackoverflow.com/questions/15097275/.   -  person Gaurav Mantri    schedule 25.06.2013
comment
Спасибо. Но это позволяет мне только передавать данные поставщику удостоверений и отправлять их мне после завершения аутентификации. Я не могу фактически хранить какую-либо информацию для поставщика удостоверений.   -  person Mårten Wikström    schedule 25.06.2013


Ответы (4)


IdentityProviders.js не предназначен для этой цели, поэтому у вас возникла эта проблема. Самое простое решение — жестко закодировать эти значения в вашем приложении. Если вы не хотите этого делать, вы можете получить эти значения через службу управления OData. Для каждого поставщика удостоверений, который вы найдете через службу управления, значение утверждения IdentityProvider будет idp.Issuer.Name, а значение, указанное в IdentityProviders.js, будет idp.LoginLinkName (или idp.DisplayName, если LoginLinkName не указано).

person Oren Melzer    schedule 27.06.2013

Вы можете настроить свои собственные значения для поставщика удостоверений, используя «Группа правил -> «выбрать одно» -> «Добавить», затем оставить «входное утверждение ...» как любое/любое и настроить тип выходного утверждения с тем же настраиваемым типом утверждения для каждого поставщика удостоверений, например:

"http://mycustomtype.com/usethisclaimvalue" + "uri:WindowsLiveID"

для Windows Live.

Затем вы можете использовать это добавленное утверждение в качестве источника для оператора переключения внутри приложения.

person Danila Polevshikov    schedule 01.07.2013

Я пытался сделать это на прошлой неделе и не смог найти способ сопоставить значение в заявке со значением в IdentityProvider.js. Я приземлился в поисках конкретных значений. Единственное, что я могу предложить, это какой-то ресурс/код, который понимает отображение. Я просто искал конкретный и сделал что-то вроде этого:

return (HttpContext.User.Identity as System.Security.Claims.ClaimsIdentity).Claims
.First(x => x.Type ==  "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider").Value
.Contains("Google")

Я искал сверху и снизу данные, но не смог найти. Если да, пожалуйста, отправьте ответ, я также хотел бы знать

person Simon Munro    schedule 25.06.2013

Я решил эту проблему, создав пользовательское правило в ACS для каждого из моих поставщиков удостоверений, где я жестко закодировал выходное значение, чтобы оно соответствовало значению имени из IdentityProvider.js. Таким образом, жестко закодированные значения находятся в ACS и не зависят от приложения, если у вас несколько приложений.

Вот пример того, как я установил правило. - http://screencast.com/t/jfDqX0cqu

person gaestes    schedule 02.07.2013