从SQL Server向ADFS添加自定义声明

时间:2018-08-01 23:38:40

标签: sql-server adfs

我正在尝试通过SQL添加自定义属性,我正在按照[https://blogs.technet.microsoft.com/vinitt/2013/04/15/how-to-use-to-custom-sql-attribute-store-to-generate-claims-and-authorize-user]

上的步骤进行操作

我安装了带有表“ attributes”的SQL Server,但是接下来我要讲到有关中继方信任的步骤...只需编辑不存在的中继方信任。 (应用程序现在可以正常工作,这是一个使用ADFS提供身份验证但不提供授权的网站)-我有API端代码来查询数据库并即时添加Claims,但这仅适用于服务器边代码,我们确实需要JWT中的这些声明。

所以,看这篇文章,一切看起来都很棒。我得到了SQL Server,我只需要添加规则就可以在验证该人的登录后点击服务器。

听起来像小菜一碟,但是没有地方可以添加声明规则-因为我没有(或不需要?)任何中继方信任-AD FS服务器可以100%处理,因此无需任何中继。我试图添加一个,但无法解决第一个问题。猜到了那个问题,无法解决第二个问题。在这一点上,我放弃了……我怀疑是否可以将随机数据输入表单。

有人可以告诉我如何添加吗?请注意:这不是Sharepoint网站,与Sharepoint无关。这是一个.Net网站,它运行一个有角度的应用程序,该应用程序重定向到ADFS服务器,并使用令牌重定向回去。

因此,此声明规则有任何问题:

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"]
 => issue(store = "SQL", types = ("http://schemas.microsoft.com/ws/2008/06/identity/claims/role"), query = "SELECT role from dbo.ADFS_attributes where logon={0}", param = c.Value);

具体来说,属性表具有登录名和角色,我正在尝试根据该用户的记录创建角色。 (在这种情况下,应该为每个结果创建一个(希望如此))

我试图将其更改为“选择'管理员'角色”,以便始终返回要使用的角色,但这也不起作用。我没有在事件日志中看到任何错误,什么也没有...对返回的JWT没有任何更改。(仍然是相同数量的声明)-我什至似乎都没有添加“电子邮件”作为通行证通过索赔,所以我在这里丢失了一些东西,否则,它在这里丢失了一些..我不知道什么。

好的,为了确保它能正常工作,我添加了以下声明规则:

 => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role", Value = "Admin");

是的,将其直接添加到Active Directory提供程序信任中,因此它将始终添加“管理员”角色。娜达。

我直接将其添加到了“ Web应用程序” /“发行转换规则”中,因此没有机会不添加它。...不,没有。

我还验证了索赔说明中是否包含“角色”,并检查是否已将其发布为已接受和已发送...

仍然在JTW中获得了我一直得到的相同的旧10项。

哦,我尝试重新启动“ Active Directory联合身份验证服务”服务... 当调试器在网页上启动时,并标记为“清除浏览器缓存”。

ADFS之类的声音实际上不起作用,或者没有声明规则运行。某处是否存在需要启用“启用自定义规则”的全局设置?

2 个答案:

答案 0 :(得分:1)

This是更好的文章,因为它没有引用SharePoint。

此外,规则应该是“问题”,而不是“添加”。

在RP端,添加索赔规则。

您需要RP信任,因为这是要获取声明规则的应用程序。

要手动添加RP信任,请参考this

您还提到JWT吗?您正在使用什么协议? SAML? OpenID Connect?

答案 1 :(得分:0)

结果是您可以将规则添加到“应用程序组” /“ Web应用程序”,然后选择“颁发转换规则”并在其中添加SQL Claim规则:

c:[Type ==“ http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”]]  => issue(store =“ SQL”,类型=(“ http://schemas.microsoft.com/ws/2008/06/identity/claims/role”),查询=“来自dbo的SELECT角色。ADFS_attributes,其中logon = {0}”,param = c.Value);

如果您有多个角色,则可以添加多个角色。

我没有看到这的主要原因是,放置在此上的UI(以某种方式)将另一个令牌(没有我的角色)发回到API服务器。我正在调查该令牌的来源,为什么令牌没有得到验证(不是来自服务器,否则将添加我的角色)...很奇怪,

使用PostMan发布到服务器,然后查看返回的JWT很好,解决了该问题...

似乎所有JWT签名验证不是由最后一个人完成的...