2016-07-12 26 views
1

Ich verwende die Microsoft.Graph-Bibliothek here, um einen Benutzer in Azure AD zu aktualisieren. Dies funktioniert für einige Benutzer, für andere jedoch nicht. Mein Code sieht wie folgt aus:Json-Serialisierungsfehler beim Aktualisieren des Benutzers in Azure AD über GRAPH

public async Task<User> UpdateUser(AdUser adUser) 
{ 
    var graphServiceClient = new GraphServiceClient(_azureAuthenticationProvider); 

    var user = await GetUser(adUser.UserPrincipalName); 

    user.GivenName = adUser.GivenName; 
    user.Surname = adUser.LastName; 
    user.DisplayName = adUser.DisplayName; 
    user.Department = adUser.Department; 
    user.AccountEnabled = adUser.AccountEnabled; 

    await graphServiceClient.Users[user.UserPrincipalName].Request().UpdateAsync(user); 
    await UpdateUserGroups(adUser); 

    return await GetUser(adUser.UserPrincipalName); 
} 

Die ADUser Klasse ist recht einfach und enthält nur die Eigenschaften zu aktualisieren:

public class AdUser 
{ 
    public string UserPrincipalName { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string GivenName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName { get; set; } 
    public string Department { get; set; } 
    public List<string> OldGroups { get; set; } 
    public List<string> OldRoles { get; set; } 
    public List<string> NewGroups { get; set; } 
    public List<string> NewRoles { get; set; } 
    public bool AccountEnabled { get; set; } 
    public bool ForceChangePasswordNextSignIn { get; set; } 
} 

Für die ersten drei Benutzer aktualisiert werden, dies ganz gut funktioniert. Beim vierten Benutzer erhalte ich eine generische AggregateException mit der Meldung "Ausnahme vom Typ 'Microsoft.Graph.ServiceException' wurde ausgelöst."

Fiddler Anzündung zeigt die ausgefallene Anfrage:

await graphServiceClient.Users[user.UserPrincipalName].Request().UpdateAsync(user); 

Dies geschieht immer für den gleichen Benutzer:

{ 
    "error": { 
    "code": "InternalServerError", 
    "message": "Can not add property department to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.", 
    "innerError": { 
     "request-id": "b82c4098-6031-40c4-ac6a-4f43746e7b48", 
     "date": "2016-07-12T05:55:08" 
    } 
    } 
} 

Wenn ich Schritt durch den Code, kann ich die Fehler in dieser Zeile sehen auftritt . Irgendwelche Ideen?

Danke !!!

Update 1: Für Vollständigkeit, sieht meine GetUser Methode wie folgt:

public const string AdUserFields = "UserPrincipalName,DisplayName,GivenName,Surname,Department,MemberOf,AccountEnabled"; 

public async Task<User> GetUser(string userPrincipalName, string fields = AdUserFields) 
{ 
    var graphServiceClient = new GraphServiceClient(_azureAuthenticationProvider); 

    var user = await graphServiceClient.Users[userPrincipalName].Request().Select(fields).GetAsync(); 

    return user; 
} 

Update 2: Die Anfrage und Antwort sieht wie folgt aus. Beachten Sie, dass ich das JSON nicht erstellt habe, das SDK macht das für mich. Ich bin mir der doppelten Schlüssel in der Anfrage:

ANFRAGE:

PATCH https://graph.microsoft.com/v1.0/users/[email protected] HTTP/1.1 
SdkVersion: graph-dotnet-1.0.1 
Authorization: Bearer <token> 
Cache-Control: no-store, no-cache 
Content-Type: application/json 
Host: graph.microsoft.com 
Content-Length: 478 
Expect: 100-continue 

{"accountEnabled":true,"businessPhones":[],"department":"department","displayName":"Jane Doe (department)","givenName":"Jane","surname":"Doe","userPrincipalName":"[email protected]","id":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users/$entity","givenName":null,"jobTitle":null,"mail":null,"mobilePhone":null,"officeLocation":null,"preferredLanguage":null,"surname":null} 

RESPONSE:

HTTP/1.1 500 Internal Server Error 
Cache-Control: private 
Transfer-Encoding: chunked 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/8.5 
request-id: 2c0437b3-2438-4a34-bf70-937bec2143d1 
client-request-id: 2c0437b3-2438-4a34-bf70-937bec2143d1 
x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"SouthEast Asia","Slice":"SliceB","ScaleUnit":"001","Host":"AGSFE_IN_0","ADSiteName":"SIN"}} 
Duration: 30.6384 
X-Powered-By: ASP.NET 
Date: Wed, 13 Jul 2016 03:08:14 GMT 

142 
{ 
    "error": { 
    "code": "InternalServerError", 
    "message": "Can not add property givenName to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.", 
    "innerError": { 
     "request-id": "2c0437b3-2438-4a34-bf70-937bec2143d1", 
     "date": "2016-07-13T03:08:14" 
    } 
    } 
} 
0 
+0

Was sind die genauen Bodydaten für die REST-Anforderung? –

+0

Ich habe die Anfrage und Antwort in Update 2 oben hinzugefügt. Vielen Dank! –

+0

Ich habe auch ein Problem auf GitHub protokolliert: https://github.com/microsoftgraph/msgraph-sdk-dotnet/issues/28 –

Antwort

3

ich dies auf einen Fehler aufgespürt habe auf dem Weg nach unten sind wir die JSON-Daten in ihre jeweiligen Modelle de-Serialisierung. Die Modelleigenschaften werden Standard-.NET-Datenverträgen zugeordnet. Wir verwenden jedoch NewtonSoft, um die eigentliche JSON-Arbeit auszuführen. Die Kombination der beiden führt dazu, dass Nullwerte für Eigenschaften falsch in die AdditionalData-Dictionary-Eigenschaft eingefügt werden (ein "Catch-all" -Bucket für unbekannte Werte).

Eine Fehlerbehebung für dieses Problem wird mit dem nächsten SDK-Update veröffentlicht.Sie können es verfolgen here vorwärts bewegen.

Um das Problem für die Kurzzeitlösung umgehen zu können, können Sie das AdditionalData-Wörterbuch durchlaufen und alle Einträge entfernen, bei denen der Schlüssel einer bekannten Eigenschaft im Modell entspricht. Wenn Sie dies tun, bevor Sie das Update senden, sollte es korrekt funktionieren.

Mehr Details

Es ist möglich, diesen Fehler generell außerhalb unserer SDK zu reproduzieren. Zum Beispiel:

<!-- language: c# --> 

public class User 
{ 
    [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "name")] 
    public string Name { get; set; } 

    [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "department")] 
    public string Department { get; set; } 

    [JsonExtensionData(ReadData = true, WriteData = true)] 
    public IDictionary<string, object> AdditionalData { get; set; } 
} 

void SomeFunction() 
{ 
    string json = @"{ 'name': 'Bob Smith', 'department': null }"; 
    var user = JsonConvert.DeserializeObject<User>(json); 

    // Inspecting user here will show the Name property with the correct 
    // value, the Department property with a null value, but will also 
    // have a "department = null" key/value pair incorrectly in the 
    // AdditionalData property. 
} 
+0

Hallo Robert, danke, dass du an mir gearbeitet hast! Sehr geschätzt! –

0

Die JSON-Daten in die Sie anfordern wird ungültig, hat es doppelte Eigenschaft , givenName und Nachname wie Abbildung unten:

enter image description here Bitte entfernen Sie das Duplikat und stellen Sie sicher, dass die JSON-Daten validiert sind. Sie können es unter here überprüfen.

Und um den Benutzer zu aktualisieren, müssen wir nur das geänderte Feld, das wir wollten, bereitstellen. Zum Beispiel ist hier das Update anschließend für den Benutzer für Ihre Referenz die Abteilung Probe:

var user = graphserviceClient.Me.Request(); 
var newUser = new User(); 
newUser.Department = "dep1"; 
var updateUser=await user.UpdateAsync(newUser); 
+0

Ich erkenne, es gibt einen doppelten Schlüssel, aber ich verwende das GRAPH SDK von nuget. Ich baue das JSON nicht, das SDK tut es –