用于C#的SCIM(跨域身份管理系统)库

时间:2013-05-06 00:17:04

标签: c# .net identity scim

创建SCIM标准是为了通过定义用于表示用户和组的模式以及用于所有必要CRUD操作的REST API来简化云中的用户管理。

旨在取代旧的SPML协议。

那里有“成熟”的C#库吗?

我用google搜索的大部分内容都是针对Java的,否则看起来并不活跃。

更新

回应评论:

这些库通常采用以下形式:

User = new User;
User.name = "name";
... etc ...
User.Create;

换句话说,它通过使用模型用户隐藏了底层实现。这样您就不必担心实际协议的细节了。

3 个答案:

答案 0 :(得分:7)

我已经更新了我的原始答案,希望能提供更好的信息。

A)这个库应该(希望)是您正在寻找的东西:

<强> Microsoft.SystemForCrossDomainIdentityManagement

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

该项目的一位作者最近对其进行了更新,以包含v1和v2 SCIM对象支持,您对博客文章的链接绝对正确,这解释了图书馆的目的。

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

(作者现在已将此添加到nuget的摘要中,因此在阅读博客文章之前找到nuget库的人不会像我一样困惑。)

以下是基于GET请求(对Facebook)反序列化用户的示例,您可以在POST或PUT之前轻松创建新的用户对象并设置其属性等。它进入系统。

public static async Task GetUser()
{
    var oauthToken = "123456789foo";
    var baseUrl = "https://www.facebook.com/company/1234567890/scim/";
    var userName = "foo@bar.com";

    using (var client = new HttpClient())
    {
        // Set up client and configure for things like oauthToken which need to go on each request
        client.BaseAddress = new Uri(baseUrl);

        // Spoof User-Agent to keep Facebook happy
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", oauthToken);

        try
        {
            var response = await client.GetAsync($"Users?filter=userName%20eq%20%22{userName}%22");
            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync();

            // This is the part which is using the nuget library I referenced
            var jsonDictionary = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);
            var queryResponse = new QueryResponseJsonDeserializingFactory<Core1EnterpriseUser>().Create(jsonDictionary);
            var user = queryResponse.Resources.First();                    
        }
        catch (Exception ex)
        {
            // TODO: handle exception
        }
    }
}

我最初遇到的问题是使用Newtonsoft deserialzier而不是MS:

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

退回Dictionary<string, object>,但工厂无法正确使用它。

如果您正在使用SCIM规范的v2,则可以使用Core2UserCore2EnterpriseUser类。

此外,我相信图书馆可以处理请求的创建(如果你想要的话,而不是自己制作它们,这似乎相当简单),这是该项目作者的另一个片段(Craig McMurtry) )

/* 
 * SampleProvider() is included in the Service library.  
 * Its SampleResource property provides a 2.0 enterprise user with values
 * set according to the samples in the 2.0 schema specification.
 */
var resource = new SampleProvider().SampleResource; 

// ComposePostRequest() is an extension method on the Resource class provided by the Protocols library. 
request = resource.ComposePostRequest("http://localhost:9000"); 

我希望这一切都有所帮助,非常感谢微软的克雷格·麦克默特里(Craig McMurtry),他一直非常乐于帮助我使用图书馆 - 所以我不需要手工制作所有图书馆我自己的模特课。

答案 1 :(得分:0)

请评估开源项目https://github.com/PowerDMS/Owin.Scim。我一直在领导这项开发工作。虽然它缺少微软已经很好地实现的一些功能,但它在scim的大多数其他领域都要完整得多。看看它是否符合您的需求,我们欢迎所有反馈,以帮助塑造owin.scim的未来。

答案 2 :(得分:0)

我建议使用SimpleIdServer.Scim https://github.com/simpleidserver/SimpleIdServer作为替代方案。我最终没有使用Web API,但仍然可以满足我的需求。