Nano Hash - криптовалюты, майнинг, программирование

API Azure Graph — ClaimsMappingPolicy с ClaimsTransformation

Я пытаюсь автоматизировать настройку корпоративного приложения через API Azure Graph. В частности, это пользовательский интерфейс администратора Azure Palo Alto — https://docs.microsoft.com/en-us/azure/active-directory/saas-apps/paloaltoadmin-tutorial#configure-azure-ad-sso.

Мне удалось заставить это работать через интерфейс, но у меня возникли проблемы с настройкой пользовательских утверждений через Graph API.

На данный момент я просто хочу использовать строковое утверждение в пользовательском утверждении в качестве значения customadmin с жестко запрограммированным значением для роли администратора Azure Palo Alto Admin UI SAML Claim

При создании через портал можно легко ввести строковое значение в качестве исходного типа претензии. Однако через Graph API тип источника должен быть user, resource, audience, company или transformation.

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-claims-mapping#claim-schema-entry-elements

Кажется, вы можете создать string тип transformation, а затем связать трансформацию с основным ClaimsSchema.

Аналогичный пример описан здесь https://docs.microsoft.com/en-us/graph/api/resources/claimsmappingpolicy?view=graph-rest-1.0#example-definition-that-uses-a-claims-transformation Но я не могу заставить этот пример работать. Даже с небольшим массажем пример не работает. Это то, что я пытался:

cat <<- EOF > claims.json
{
  "definition": [
    "{\"ClaimsMappingPolicy\":{
        \"Version\":1,
        \"IncludeBasicClaimSet\":\"true\",
        \"ClaimsSchema\":[
        {\"Source\":\"user\",\"ID\":\"extensionattribute1\"},{\"Source\":\"transformation\",\"ID\":\"DataJoin\",\"TransformationId\":\"JoinTheData\",\"JwtClaimType\":\"JoinedData\"}
        ],
         \"ClaimsTransformation\":[
        {\"ID\":\"JoinTheData\",\"TransformationMethod\":\"Join\",\"InputClaims\":[{\"ClaimTypeReferenceId\":\"extensionattribute1\",\"TransformationClaimType\":\"string1\"}], \"InputParameters\": [{\"ID\":\"string2\",\"Value\":\"sandbox\"},{\"ID\":\"separator\",\"Value\":\".\"}],\"OutputClaims\":[{\"ClaimTypeReferenceId\":\"DataJoin\",\"TransformationClaimType\":\"outputClaim\"}]}
        ]
    }}"
  ],
  "displayName": "Azure Reference Claim",
  "isOrganizationDefault": false
}
EOF
az rest --method post --headers Content-type="application/json" --url "https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies" --body @claims.json

Я пробовал оба API v1.0 и beta, но они оба имеют одинаковое поведение.

Который возвращается со следующей ошибкой:

Bad Request({
  "error": {
    "code": "Request_BadRequest",
    "message": "Property  has an invalid value.",
    "innerError": {
      "date": "2020-09-01T13:03:10",
      "request-id": "bc7cf58e-fe6d-47d1-b1e5-cae43326864f"
    }
  }
})

Мне удалось заставить работать остальную часть претензии Пало-Альто (за исключением пользовательской строки) со следующим:

{
  "definition": [
    "{\"ClaimsMappingPolicy\":{
        \"Version\":1,
        \"IncludeBasicClaimSet\":\"true\",
         \"ClaimsSchema\": [{\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier\"},{\"Source\":\"user\",\"ID\":\"givenname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname\"},{\"Source\":\"user\",\"ID\":\"displayname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\"},{\"Source\":\"user\",\"ID\":\"surname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname\"},{\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"username\"}]
         }}"
  ],
  "displayName": "Palo Alto Claims Policy",
  "isOrganizationDefault": false
}

И мне удалось создать преобразование CustomString, которое ни с чем не связано со следующим:

{
  "definition": [
    "{\"ClaimsMappingPolicy\":{
      \"Version\":1,
      \"IncludeBasicClaimSet\":\"true\",
      \"ClaimsTransformation\":[{\"ID\":\"CreateTermsOfService\",\"TransformationMethod\":\"CreateStringClaim\",\"InputParameters\": [{\"ID\":\"value\",\"DataType\":\"string\", \"Value\":\"sandbox\"}],\"OutputClaims\":[{\"ClaimTypeReferenceId\":\"TOS\",\"TransformationClaimType\":\"createdClaim\"}]}]
    }}",
    ],
    "displayName": "sdfa",
    "isOrganizationDefault": false
}

Однако, когда я пробую их вместе в формате примера, я получаю сообщение об ошибке.

{
  "definition": [
    "{\"ClaimsMappingPolicy\":{
        \"Version\":1,
        \"IncludeBasicClaimSet\":\"true\",
        \"ClaimsSchema\": [
            {\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier\"},{\"Source\":\"user\",\"ID\":\"givenname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname\"},{\"Source\":\"user\",\"ID\":\"displayname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\"},{\"Source\":\"user\",\"ID\":\"surname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname\"},{\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"username\"},{\"Source\":\"transformation\",\"TransformationID\":\"xxxxxxxxx\",\"ID\":\"DataJoin\",\"SamlClaimType\":\"test\"}
        ],
        \"ClaimsTransformation\":[
            {\"ID\":\"xxxxxxxxx\",\"TransformationMethod\":\"CreateStringClaim\",\"InputParameters\": [{\"ID\":\"value\",\"DataType\":\"string\", \"Value\":\"sandbox\"}],\"OutputClaims\":[{\"ClaimTypeReferenceId\":\"DataJoin\",\"TransformationClaimType\":\"createdClaim\"}]}
        ]
    }}"
  ],
  "displayName": "Palo Alto Claims Policy",
  "isOrganizationDefault": false
}

Что возвращает ту же бесполезную ошибку:

Bad Request({
  "error": {
    "code": "Request_BadRequest",
    "message": "Property  has an invalid value.",
    "innerError": {
      "date": "2020-09-01T13:03:10",
      "request-id": "bc7cf58e-fe6d-47d1-b1e5-cae43326864f"
    }
  }
})

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

Я полагаю, что могу избежать этой ситуации и заставить PA интегрироваться с AAD без жестко закодированного значения, но я чувствую, что должен заставить это работать таким образом.

Обязательное кодирование объекта ClaimMappingPolicy усложняет его разработку, так что, возможно, где-то есть проблема. Я также пытался просто создать ClaimsSchema без ClaimsTransformation, а затем запустить PATCH, чтобы изменить объект с помощью преобразованного объекта, но он просто перезаписывает весь объект ClaimsMappingPolicy, а не добавляет только дополнительное поле.

Когда я удаляю источник преобразования из ClaimsSchema, запрос выполняется успешно.

cat <<- EOF > claims.json
{
  "definition": [
    "{\"ClaimsMappingPolicy\":{
        \"Version\":1,
        \"IncludeBasicClaimSet\":\"true\",
        \"ClaimsSchema\": [
            {\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier\"},{\"Source\":\"user\",\"ID\":\"givenname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname\"},{\"Source\":\"user\",\"ID\":\"displayname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\"},{\"Source\":\"user\",\"ID\":\"surname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname\"},{\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"username\"}
        ],
        \"ClaimsTransformation\":[
           {\"ID\":\"xxxxxxxxx\",\"TransformationMethod\":\"CreateStringClaim\",\"InputParameters\": [{\"ID\":\"value\",\"DataType\":\"string\", \"Value\":\"sandbox\"}],\"OutputClaims\":[{\"ClaimTypeReferenceId\":\"DataJoin\",\"TransformationClaimType\":\"createdClaim\"}]}
        ]
    }}"
  ],
  "displayName": "Palo Alto Claims Policy",
  "isOrganizationDefault": false
}
EOF

Но нет связи между ClaimsSchema и ClaimsTransformation. Это намекает на проблему с объектом ClaimsSchema

{\"Source\":\"transformation\",\"TransformationID\":\"xxxxxxxxx\",\"ID\":\"DataJoin\",\"SamlClaimType\":\"test\"}

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


  • Есть такая же проблема. Похоже, эта конечная точка все еще находится в процессе изменения. 03.09.2020
  • Мне удалось разблокировать мою конкретную проблему, создав роль с APIm, назначив ее пользователю с помощью API, а затем используя утверждение user.assignedroles. Однако на самом деле это не решает эту конкретную проблему использования жестко закодированного утверждения на основе строки. 03.09.2020

Ответы:


1

Предоставление информации в ответе, так как она слишком длинная, чтобы комментировать ее. Пожалуйста, попробуйте этот запрос ниже в проводнике Graph

Опубликовать https://graph.microsoft.com/beta/policies/claimsMappingPolicies

 {"definition":["{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\", \"ClaimsSchema\":[{\"Source\":\"user\",\"ID\":\"extensionattribute1\"},{\"Source\":\"transformation\",\"ID\":\"DataJoin\",\"TransformationId\":\"JoinTheData\",\"JwtClaimType\":\"JoinedData\"}],\"ClaimsTransformations\":[{\"ID\":\"JoinTheData\",\"TransformationMethod\":\"Join\",\"InputClaims\":[{\"ClaimTypeReferenceId\":\"extensionattribute1\",\"TransformationClaimType\":\"string1\"}], \"InputParameters\": [{\"ID\":\"string2\",\"Value\":\"sandbox\"},{\"ID\":\"separator\",\"Value\":\".\"}],\"OutputClaims\":[{\"ClaimTypeReferenceId\":\"DataJoin\",\"TransformationClaimType\":\"outputClaim\"}]}]}}"],"displayName":"TestclaimsPolicy","isOrganizationDefault":false}

введите здесь описание изображения

Опубликовать https://graph.microsoft.com/beta/policies/claimsMappingPolicies

{"definition":["{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\",\"ClaimsSchema\": [{\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier\"},{\"Source\":\"user\",\"ID\":\"givenname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname\"},{\"Source\":\"user\",\"ID\":\"displayname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\"},{\"Source\":\"user\",\"ID\":\"surname\",\"SamlClaimType\":\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname\"},{\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\":\"username\"}],\"ClaimsTransformation\":[{\"ID\":\"CreateTermsOfService\",\"TransformationMethod\":\"CreateStringClaim\",\"InputParameters\": [{\"ID\":\"value\",\"DataType\":\"string\", \"Value\":\"sandbox\"}],\"OutputClaims\":[{\"ClaimTypeReferenceId\":\"TOS\",\"TransformationClaimType\":\"createdClaim\"}]}]}}"],"displayName":"Test1234","isOrganizationDefault":false}

введите здесь описание изображения

дополнительные сведения о CreateTermsOfService см. в этом документе

04.09.2020
  • Здравствуйте, спасибо за ваш ответ, но вы не используете CreateStringClaim. В вашем примере вы расширяете user источник extensionattribute1 случайной строкой, а это не то, что я пытаюсь сделать. Спасибо. 06.09.2020
  • Обновленный ответ. Пожалуйста, дайте нам знать, если это поможет. 08.09.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..