在我们的ADFS 3.0中,我们有一个自定义属性存储,它与rest-service通信,以根据用户ID检索特定属性。这些属性带有一个urn和一个值。我的目标是将从rest-service集中检索到的urn设置为claim-type,但是这种类型似乎是在你从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声明规则语言在我的自定义属性存储中以编程方式设置声明类型?
答案 0 :(得分:0)
有一种方法可以从自定义属性存储中动态发出任何一对声明类型和值。 This article让我弄清楚了。
您的自定义属性存储需要返回一列字符串值,其中每个值表示一个声明类型及其对应的值,由一个特殊字符(本例中为分号)分隔:
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, "^.*?;", ""));
可能有点复杂,但它确实有效。