2017-11-06 4 views
2

Wir suchen Benutzer im Verzeichnis azure ad b2c abzufragen und ihre Login-E-Mails programmatisch für alle Arten von Benutzern zu extrahieren. Was wir zu verstehen:So identifizieren Sie verschiedene Arten von Benutzern in azure b2c

  • Standard User
  • Gastnutzer (B2B)
  • Local User (B2C Benutzer, der mit E-Mail angemeldet)
  • Social Benutzer (B2C Benutzer, der mit einem sozialen unterzeichnet Konto)

wenn der aPI-Aufruf mit dem azur ad graph Explorer ausgeführt wird:

https://graph.windows.net/myorganization/users?api-version=1.6 

können wir alle diese Benutzer sehen. (Daten werden hygienisiert ein wenig)

Beispiel Standardbenutzer

{ 
      "odata.type": "Microsoft.DirectoryServices.User", 
      "objectType": "User", 
      "objectId": "8b7c468b-fec4-4ff2-b448-64f99f3fa9ff", 
      "deletionTimestamp": null, 
      "accountEnabled": true, 
      "assignedLicenses": [], 
      "assignedPlans": [], 
      "city": null, 
      "companyName": null, 
      "country": null, 
      "creationType": null, 
      "department": null, 
      "dirSyncEnabled": null, 
      "displayName": "Global User", 
      "employeeId": null, 
      "facsimileTelephoneNumber": null, 
      "givenName": null, 
      "immutableId": null, 
      "isCompromised": null, 
      "jobTitle": null, 
      "lastDirSyncTime": null, 
      "mail": null, 
      "mailNickname": "global.user", 
      "mobile": null, 
      "onPremisesDistinguishedName": null, 
      "onPremisesSecurityIdentifier": null, 
      "otherMails": [], 
      "passwordPolicies": null, 
      "passwordProfile": null, 
      "physicalDeliveryOfficeName": null, 
      "postalCode": null, 
      "preferredLanguage": null, 
      "provisionedPlans": [], 
      "provisioningErrors": [], 
      "proxyAddresses": [], 
      "refreshTokensValidFromDateTime": "2017-10-31T17:20:29Z", 
      "showInAddressList": null, 
      "signInNames": [], 
      "sipProxyAddress": null, 
      "state": null, 
      "streetAddress": null, 
      "surname": null, 
      "telephoneNumber": null, 
      "usageLocation": null, 
      "userIdentities": [], 
      "userPrincipalName": "[email protected]", 
      "userType": "Member" 
     } 

Beispiel Gastnutzer

{ 
      "odata.type": "Microsoft.DirectoryServices.User", 
      "objectType": "User", 
      "objectId": "6458e1fc-c27b-40cb-b83d-2124f0999130", 
      "deletionTimestamp": null, 
      "accountEnabled": true, 
      "assignedLicenses": [], 
      "assignedPlans": [], 
      "city": null, 
      "companyName": null, 
      "country": null, 
      "creationType": null, 
      "department": null, 
      "dirSyncEnabled": null, 
      "displayName": "displayname", 
      "employeeId": null, 
      "facsimileTelephoneNumber": null, 
      "givenName": "givenname", 
      "immutableId": null, 
      "isCompromised": null, 
      "jobTitle": null, 
      "lastDirSyncTime": null, 
      "mail": null, 
      "mailNickname": "qa_theaccesshub.com#EXT#", 
      "mobile": null, 
      "onPremisesDistinguishedName": null, 
      "onPremisesSecurityIdentifier": null, 
      "otherMails": [ 
       "[email protected]" 
      ], 
      "passwordPolicies": null, 
      "passwordProfile": null, 
      "physicalDeliveryOfficeName": null, 
      "postalCode": null, 
      "preferredLanguage": null, 
      "provisionedPlans": [], 
      "provisioningErrors": [], 
      "proxyAddresses": [], 
      "refreshTokensValidFromDateTime": "2017-10-31T15:36:22Z", 
      "showInAddressList": null, 
      "signInNames": [], 
      "sipProxyAddress": null, 
      "state": null, 
      "streetAddress": null, 
      "surname": "surname", 
      "telephoneNumber": null, 
      "usageLocation": null, 
      "userIdentities": [], 
      "userPrincipalName": "qa_theaccesshub.com#EXT#@qa2clientb2ctheaccesshub.onmicrosoft.com", 
      "userType": "Member" 
     } 

Beispiel Local User

{ 
      "odata.type": "Microsoft.DirectoryServices.User", 
      "objectType": "User", 
      "objectId": "a941e75d-2c1b-4383-9d6c-783c1d008479", 
      "deletionTimestamp": null, 
      "accountEnabled": true, 
      "assignedLicenses": [], 
      "assignedPlans": [], 
      "city": null, 
      "companyName": null, 
      "country": null, 
      "creationType": "LocalAccount", 
      "department": null, 
      "dirSyncEnabled": null, 
      "displayName": "Display Name", 
      "employeeId": null, 
      "facsimileTelephoneNumber": null, 
      "givenName": "Glen", 
      "immutableId": null, 
      "isCompromised": null, 
      "jobTitle": null, 
      "lastDirSyncTime": null, 
      "mail": null, 
      "mailNickname": "98c4f2cf-a452-46a4-a33f-6fb451bc3f59", 
      "mobile": null, 
      "onPremisesDistinguishedName": null, 
      "onPremisesSecurityIdentifier": null, 
      "otherMails": [], 
      "passwordPolicies": "DisablePasswordExpiration", 
      "passwordProfile": null, 
      "physicalDeliveryOfficeName": null, 
      "postalCode": null, 
      "preferredLanguage": null, 
      "provisionedPlans": [], 
      "provisioningErrors": [], 
      "proxyAddresses": [], 
      "refreshTokensValidFromDateTime": "2017-11-03T18:18:36Z", 
      "showInAddressList": null, 
      "signInNames": [ 
       { 
        "type": "emailAddress", 
        "value": "[email protected]" 
       } 
      ], 
      "sipProxyAddress": null, 
      "state": null, 
      "streetAddress": null, 
      "surname": "Martin", 
      "telephoneNumber": null, 
      "usageLocation": null, 
      "userIdentities": [], 
      "userPrincipalName": "[email protected]microsoft.com", 
      "userType": "Member" 
     } 

Beispiel Social Benutzer

{ 
      "odata.type": "Microsoft.DirectoryServices.User", 
      "objectType": "User", 
      "objectId": "917bddd5-40d8-4a25-9a6e-8317a6949b48", 
      "deletionTimestamp": null, 
      "accountEnabled": false, 
      "assignedLicenses": [], 
      "assignedPlans": [], 
      "city": null, 
      "companyName": null, 
      "country": null, 
      "creationType": null, 
      "department": null, 
      "dirSyncEnabled": null, 
      "displayName": "Display Name", 
      "employeeId": null, 
      "facsimileTelephoneNumber": null, 
      "givenName": "GivenName", 
      "immutableId": null, 
      "isCompromised": null, 
      "jobTitle": null, 
      "lastDirSyncTime": null, 
      "mail": null, 
      "mailNickname": "unknown", 
      "mobile": null, 
      "onPremisesDistinguishedName": null, 
      "onPremisesSecurityIdentifier": null, 
      "otherMails": [ 
       "[email protected]" 
      ], 
      "passwordPolicies": null, 
      "passwordProfile": { 
       "password": null, 
       "forceChangePasswordNextLogin": true, 
       "enforceChangePasswordPolicy": false 
      }, 
      "physicalDeliveryOfficeName": null, 
      "postalCode": null, 
      "preferredLanguage": null, 
      "provisionedPlans": [], 
      "provisioningErrors": [], 
      "proxyAddresses": [], 
      "refreshTokensValidFromDateTime": "2017-11-02T13:48:09Z", 
      "showInAddressList": null, 
      "signInNames": [], 
      "sipProxyAddress": null, 
      "state": null, 
      "streetAddress": null, 
      "surname": "Surname", 
      "telephoneNumber": null, 
      "usageLocation": null, 
      "userIdentities": [], 
      "userPrincipalName": "[email protected]ub.onmicrosoft.com", 
      "userType": "Member" 
     } 

Zusammenfassend stellen wir fest:

Standard User

  • das userprincipal sieht normal
  • die Login E-Mail finden Sie unter: userprincipal
  • Erstellungsart ist: nu ll

Gastnutzer

  • die userprincipal die externe Verzeichnisse upn von '# EXT #', gefolgt von dieser primären Domain
  • die Login E-Mail an, gefolgt zu sein, schaut zu finden ist: otherMails [0]
  • Erstelltyp ist: null

Lokale Benutzer

  • das userprincipal sieht einige Objekt-ID von diesem primären Domain
  • die Anmeldung E-Mail gefolgt sein, finden Sie unter: signInNames [0].Wert
  • Erstelltyp ist: Localaccount

Social Benutzer

  • das userprincipal 'cpim_', gefolgt von einer Objekt-ID von dieser primären Domain
  • die Anmeldung E-Mail gefolgt sein aussieht, kann gefunden werden bei: otherMails [0]
  • Erstellungsart ist: null

Obwohl wir einige Trends sehen können, würden wir lieber keine Vermutungen oder schlechten Annahmen machen. Also haben wir die folgenden Fragen:

1) Was ist der beste Weg zu wissen, welche der vier Arten von Benutzern, die wir betrachten?

2) Gibt es einen einfacheren Weg, um den Login zu bekommen (idealerweise als ein Feld, wir versuchen, dies in ein einfaches Mapping zu bauen)? Andere als:

If signInNames[0].value is not null use signInNames[0].value 
Elseif otherMails[0] is not null use otherMails[0] 
Else userPrincipalName 

3) Verhalten sich andere soziale Benutzer anders? (Wir haben Facebook bisher nur gemacht.)

4) Für Social User was ist der beste Weg zu wissen, welcher Identity Provider verwendet wird?

UPDATE 08.11:

5) Warum Benutzer nicht bekommen Localaccount ein otherMail Wert?

6) Warum erhalten Nicht-LocalAccount-Benutzer keine Anmeldenamen? Ich denke, das wurde exklusiv für B2C hinzugefügt?

7) Auch ich denke, Endbenutzer haben nicht wirklich die Fähigkeit, soziale und lokale Konten heute zu verbinden? (es sei denn, Sie verwenden eine App, die das Diagramm nutzt).

UPDATE 08.11 # 2:

8) Ist es sicher (bis jetzt) ​​davon ausgehen, dass ich ein B2C unterzeichnet-up einzelnen disambiguate können, die nur mit einem sozialen Konto anhand der folgenden Kriterien anmelden können :

  • Erstelltyp ist: null - das heißt, sie sind kein Local User
  • userprincipal mit ‚cpim_‘ durch eine UUID gefolgt vorangestellt ist - das heißt, sie sind wahrscheinlich nicht ein Standard oder Gastbenutzer

Oder würde es eine bessere Methode geben?

Antwort

6

1) Diese Eigenschaften schließen sich nicht gegenseitig aus. Ein lokaler Benutzer, ein Gast oder ein Mitglied kann beispielsweise seine verschiedenen sozialen Profile mit seinem Konto verknüpfen. Die zugrunde liegenden Daten (verfügbar über die Graph-API) treffen keine Annahmen.

Die zuverlässigste Möglichkeit zu ermitteln, ob ein Konto ein lokaler Benutzer ist oder nicht, ist die creationType-Eigenschaft. Sie können sich auch signInNames ansehen. Allerdings würde dies nicht bedeuten, dass der Nutzer sein soziales Profil in Zukunft nicht verlinken wird. Es ist nur so, dass diese Funktionalität in B2C-Standardrichtlinien nicht verfügbar ist.

2) signInNames wird sicherlich zum Anmelden des Benutzers verwendet. Ein Benutzer kann jedoch auch mehr als einen signInName haben, soweit das Verzeichnis betroffen ist. Deshalb ist signInNames eine Sammlung. So kann ein Versorgungsunternehmen oder eine Bank eine Konto-ID und eine E-Mail-Adresse als signInNames haben.

otherMails ist keine Eigenschaft, die zum Anmelden eines Benutzers verwendet wird. Vielleicht möchten Sie das überspringen. Denken Sie an otherMails als eine E-Mail-Adresse, die nicht für jede kritische Funktion durch das Verzeichnis verwendet wird (z. B. wird es nicht zum Anmelden oder zum Zurücksetzen von Passwörtern usw. verwendet)

Sie würden für Arbeitskonten verwenden.

3) Alle Social Accounts werden als externe Benutzeridentitäten betrachtet und auf die gleiche Weise abgebildet. Sie sind noch nicht über die Graph-API verfügbar, aber wenn dies der Fall ist, werden sie auch als Sammlung angezeigt, da ein Benutzer möglicherweise mehrere soziale Konten verknüpft.

4) Nicht möglich heute, aber in der Zukunft kommen.

UPDATE 08.11 weitere Fragen

5) einfach zu beantworten, weil es keine E-Mail-Adresse in B2C-Standardablauf ist in otherMails für lokales Konto Benutzer hinzuzufügen. Die E-Mail-Adresse, mit der sie sich angemeldet haben, befindet sich bereits in der signInNames Eigenschaft. Über Graph API können Sie otherMails hinzufügen, und wenn ein Token ausgestellt wird, wird es in dem emails Anspruch auch für Benutzer des lokalen Kontos angezeigt.

6) Nicht lokale Benutzer erhalten keine signInName, da sie sich nicht mit einem signInNames anmelden müssen. Arbeitskonten verwenden stattdessen die userPrincipalName, die an Office 365, Exchange oder On-Premise-AD gebunden werden kann. Soziale IDPs haben externe Identitäten. Daher gibt es kein bekanntes Szenario, in dem signInNames mindestens für nicht-lokale Konten verwendet werden muss.

7) Ja, es ist heute nicht möglich, ein soziales Konto über Standardrichtlinien mit einem lokalen Konto zu verknüpfen, dies kann jedoch über benutzerdefinierte Richtlinien erfolgen. Es ist auch noch nicht über die Graph-API möglich (weil externe Identitäten noch nicht verfügbar sind), wird aber in Zukunft möglich sein, wenn die API verfügbar gemacht wird.

-Update 11/24:

8) Wenn Sie auf Benutzerprinzipalnamen suchen, werden Sie feststellen, es ist zufällig. cpim_ kann jederzeit entfernt werden, es ist nicht Teil des Vertrags. In der Tat, IMHO, sollte es bereits entfernt werden, damit Apps keine Abhängigkeit davon nehmen.

Um dies richtig zu ermitteln, erwarten wir, eine neue "userIdentities" -Eigenschaft auf dem Benutzerkonto anzukündigen, mit der Sie bestimmen können, mit welchen sozialen IDPs das Benutzerkonto verknüpft ist. Das wäre der beste Weg, dies zu tun.

+0

Vielen Dank! Das war leider die Antwort, die ich erwartet hatte. Kurz gesagt, ich kann die Anmelde-E-Mails für soziale Accounts derzeit nicht richtig erfassen. Ich sollte auch nicht davon ausgehen, dass es eine primäre E-Mail-Adresse gibt. Neugierige beiseite Fragen dann: 1) Warum erhalten LocalAccount Benutzer nicht einen anderen Mailwert? 2) und warum erhalten Nicht-LocalAccount-Benutzer keine Anmeldenamen? Ich denke, das wurde exklusiv für B2C hinzugefügt? 3) Auch ich denke, Endbenutzer haben nicht wirklich die Fähigkeit, soziale und lokale Konten heute zu verbinden? (es sei denn, Sie verwenden eine App, die das Diagramm nutzt). Nochmals vielen Dank – fei0x

+1

Ich bin Ihre zusätzlichen Fragen zum ursprünglichen Posting hinzufügen, und aktualisieren Sie dann meine Antwort zu reagieren. So können zukünftige Benutzer das einfacher sehen. –

+0

Danke nochmal, das war sehr hilfreich. Ich denke, um mein Endergebnis anzusprechen, habe ich eine letzte Frage hinzugefügt. Danke – fei0x

0

Sie können auch Informationen über Identity-Provider über MSOL anfordern:

Get-MsolUser -UserPrincipalName "<userPrincipalName>" | ConvertTo-Json 

Ausgabebeispiel

{ 
    "AlternateEmailAddresses": [ 
     "[email protected]" 
    ], 
    "AlternateMobilePhones": [], 
    "AlternativeSecurityIds": [ 
     { 
      "ExtensionData": "System.Runtime.Serialization.ExtensionDataObject", 
      "IdentityProvider": "google.com", 
      "Key": "49 48 52 56 48 54 51 54 49 55 51 49 55 55 49 57 57 50 54 55 51", 
      "Type": 6 
     } 
    ], 
    "BlockCredential": true, 
    "City": null, 
    "CloudExchangeRecipientDisplayType": null, 
    "Country": null, 
    "Department": null, 
    "DirSyncProvisioningErrors": [], 
    "DisplayName": "User", 
    "Errors": null, 
    "ExtensionData": {}, 
    "Fax": null, 
    "FirstName": null, 
    "ImmutableId": null, 
    "IndirectLicenseErrors": [], 
    "IsBlackberryUser": false, 
    "IsLicensed": false, 
    "LastDirSyncTime": null, 
    "LastName": null, 
    "LastPasswordChangeTimestamp": "/Date(1511791379000)/", 
    "LicenseReconciliationNeeded": false, 
    "Licenses": [], 
    "LiveId": "10032232271E13BD", 
    "MSExchRecipientTypeDetails": null, 
    "MobilePhone": null, 
    "ObjectId": "6f89d1fb-24be-2231-aaa3-a43d7f75db44", 
    "Office": null, 
    "OverallProvisioningStatus": 0, 
    "PasswordNeverExpires": true, 
    "PasswordResetNotRequiredDuringActivate": null, 
    "PhoneNumber": null, 
    "PortalSettings": null, 
    "PostalCode": null, 
    "PreferredLanguage": null, 
    "ProxyAddresses": [], 
    "ReleaseTrack": null, 
    "ServiceInformation": [], 
    "SignInName": "[email protected]m", 
    "SoftDeletionTimestamp": null, 
    "State": null, 
    "StreetAddress": null, 
    "StrongAuthenticationMethods": [], 
    "StrongAuthenticationPhoneAppDetails": [], 
    "StrongAuthenticationProofupTime": null, 
    "StrongAuthenticationRequirements": [], 
    "StrongAuthenticationUserDetails": null, 
    "StrongPasswordRequired": true, 
    "StsRefreshTokensValidFrom": "/Date(1511791379000)/", 
    "Title": null, 
    "UsageLocation": null, 
    "UserLandingPageIdentifierForO365Shell": null, 
    "UserPrincipalName": "[email protected]m", 
    "UserThemeIdentifierForO365Shell": null, 
    "UserType": 1, 
    "ValidationStatus": 1, 
    "WhenCreated": "/Date(1511791381000)/" 
} 

Leider Graph API enthält Feld nicht AlternativeSecurityIds mit Identity-Provider-Liste.

Verwandte Themen