1

在我们的 ADFS 3.0 中,我们有一个自定义属性存储,该属性存储与休息服务通信以根据用户 ID 检索特定属性。这些属性带有一个 urn 和一个值。我的目标是让从 rest-service 检索的骨灰盒设置为声明类型,但这种类型似乎是在您从 ADFS 的 gui 创建的所谓模板中设置的。见下面的代码:

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
=> issue(store = "Custom_AttributeStore", types = ("my:custom:urn"), query = "dummyString", param = c.Value);

是否可以使用 adfs 声明规则语言在我的自定义属性存储中以编程方式设置声明类型?

4

1 回答 1

0

有一种方法可以从自定义属性存储中动态发出任何一对声明类型和值。这篇文章帮助我弄清楚了。

您的自定义属性存储需要返回单列字符串值,其中每个值代表一个声明类型及其对应的值,由特殊字符(本示例中的分号)分隔:

public string[][] EndExecuteQuery(IAsyncResult result)
{
    ...
    return new[]
    {
        new[] { "http://example/custom-type-1;Value 1" },
        new[] { "http://example/custom-type-2;Value 2" },
        ...
    };  
}

接下来,使用自定义声明规则从自定义属性存储中检索值并从中创建任意类型的输入声明。使用add命令(创建输入声明)而不是issue命令(创建输出声明)。

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] => add(store = "YourCustomAttributeStore", types = ("custom-type-value-pair"), query = "YourQuery", param = c.Value);

最后,使用另一个自定义声明规则来获取在上一步中创建的每个输入声明,并使用它们的值来发出正确的输出声明。该RegexReplace函数可用于分隔类型和值。

c:[Type == "custom-type-value-pair"] => issue(Type = RegexReplace(c.Value, ";.*$", ""), Value = RegexReplace(c.Value, "^.*?;", ""));

这可能有点令人费解,但它确实有效。

于 2016-05-16T19:19:02.573 回答