2015-12-03 66 views
3

作爲SCIM(跨域身份管理系統)標準的新成員,請原諒任何無知,因爲我在學習過程中試圖弄清楚如何向/提供用戶,刪除用戶和修改用戶。SCI中的SCIM反序列化問題

我試圖用C#/。NET進行HTTP REST請求通過SCIM用戶,使用System.Net.Http.HttpClient

https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx

我能成功地做到這一點,並從服務器得到JSON響應,但是爲了輕鬆讀取響應對象並對其進行操作,我想反序列化它。在嘗試使用諸如JsonConvert,dynamic等等的東西之後,我偶然發現了一個微軟的nuget庫,它似乎暗示它是有用的。可悲的是有沒有出現任何文檔它*

更新: 作者之一已與鏈接到一個博客張貼這在某種程度上能夠解釋使用更新的NuGet頁面。

Microsoft.SystemForCrossDomainIdentityManagement

https://www.nuget.org/packages/Microsoft.SystemForCrossDomainIdentityManagement/

的SCIM提供商我試圖獲取數據從Facebook的是,使用他們在其網站上公佈的例子以通過電子郵件得到一個用戶:

https://developers.facebook.com/docs/facebook-at-work/provisioning/scim-api#getuserbyemail

這是C#中的一個代碼示例,它試圖從SCIM服務中獲取用戶並且需要ialize他們。我發現我回來的queryResponse在屬性填充時正確反序列化,但是Core1EnterpriseUser是第一個也是唯一的資源對象,具有空值/默認屬性。

var userName = "[email protected]"; 
var response = await client.GetAsync($"Users?filter=userName%20eq%20%22{userName}%22"); 

if (response.IsSuccessStatusCode) 
{ 
    var json = await response.Content.ReadAsStringAsync(); 
    var jsonResponseProperties = await Task.Factory.StartNew(() => { return JsonConvert.DeserializeObject<Dictionary<string, object>>(json); }); 

    var userFactory = new QueryResponseJsonDeserializingFactory<Core1EnterpriseUser>(); 
    var queryResponse = userFactory.Create(jsonResponseProperties); 

    if (queryResponse.TotalResults == 1) 
    { 
     var user = queryResponse.Resources.First(); 
     var id = user.Identifier; // this and other properties are null/false etc. 
    } 
} 

這裏是由服務返回的JSON的樣品時,我查詢它:

{ 
    "schemas": [ 
     "urn:scim:schemas:core:1.0" 
    ], 
    "totalResults": 1, 
    "itemsPerPage": 10, 
    "startIndex": 1, 
    "Resources": [ 
     { 
     "schemas": [ 
      "urn:scim:schemas:core:1.0", 
      "urn:scim:schemas:extension:enterprise:1.0", 
      "urn:scim:schemas:extension:facebook:starttermdates:1.0", 
      "urn:scim:schemas:extension:facebook:suppressclaimemail:1.0" 
     ], 
     "id": 180383108978226, 
     "userName": "foo.bar\u0040foobar.com", 
     "name": { 
      "formatted": "Foo Bar", 
      "familyName": "Bar", 
      "givenName": "Foo" 
     }, 
     "title": "Vice President", 
     "active": true, 
     "emails": [ 
      { 
       "primary": false, 
       "type": "work", 
       "value": "foo.bar\u0040foobar.com" 
      } 
     ], 
     "urn:scim:schemas:extension:enterprise:1.0": { 
      "department": "IT" 
     }, 
     "urn:scim:schemas:extension:facebook:starttermdates:1.0": { 
      "startDate": 0, 
      "termDate": 0 
     } 
     } 
    ] 
} 

UPDATE:

我在對話框我用的作者之一該項目,他慷慨地指着我在這篇博客文章:

http://blogs.technet.com/b/ad/archive/2015/11/23/azure-ad-helping-you-adding-scim-support-to-your-applications.aspx

他還更新了現在包含對SCIM v1支持的nuget庫,並指出由於JSON數據顯示Facebook使用的版本是v1:"urn:scim:schemas:core:1.0",所以現在我可以使用Core1而不是嘗試使用Core2類(我已經更新了上面的問題以使用Core1EnterpriseUser)。

我仍然無法得到我目前的反應反序列化正確,並將更新與我擁有更多信息的問題。

再次,我不使用這個庫,如果它變得顯而易見,它不容易去工作,因爲我知道nuget的簡要說明表明它是爲Azure AD創建的。

但是,我很感激任何關於如何完成這類事情的建議,因爲我確定必須有很多人使用SCIM - 你如何解析你的響應/生成你的請求你有實際的物體?你能否自動解析模式的響應,以便用正確的屬性擴充對象?

昨天晚上我起牀很晚,手工製作了一些模型類來處理響應對象 - 我似乎有工作。如果我無法使nuget庫工作(首選選項),那麼我將不得不自己去。 :/

再次感謝 peteski

+0

請檢查答案!在:https://stackoverflow.com/questions/45729018/deserialize-facebook-workplace-scim-rest-api-response/45730105#45730105 –

回答

1

雖然我還沒有關於與SCIM的最佳做法是明智的,我已經成功地得到代碼工作現在 - 與大量的感謝克雷格的NuGet庫的作者之一McMurtry在微軟!

一路上有幾件事需要解決,比如nuget包被更新爲包含以前對舊版本SCIM對象的支持。但是這裏有一個基於我的問題中的例子的片段,但事實證明這是使用Newtonsoft序列化器。 :(

在行以上代碼:

var jsonResponseProperties = await Task.Factory.StartNew(() => { return JsonConvert.DeserializeObject<Dictionary<string, object>>(json); }); 

替換爲:

var jsonResponseProperties = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json); 

的Et瞧我現在的對象的屬性反序列化...

+0

我面臨同樣的問題。您的解決方案可能解決我的解決方案的一部分但我想反序列化json強類型的對象。不管怎麼說,還是要謝謝你 –