我使用ADFS Server 2016被动重定向对asp.net mvc网站的用户进行身份验证,但我无法从SQL属性存储中获取声明。我有兴趣发现我做错了什么或错过了什么。
旁注:我正在使用Framework 4.5中的System.Identity库(我强>> 引用为旧框架版本创建的Microsoft.Identity库;大多数ADFS代码示例我偶然发现使用这些旧库。)
基础知识运作良好。所有这些都在一个领域。我将我的asp.net web.config设置为将用户重定向到我的ADFS服务器以进行身份验证。 ADFS服务器成功验证并将用户重定向回我的asp.net网站。在ADFS上,我有一个声明颁发策略规则,我只是从Active Directory中传回所有声明。
在网站上,我可以遍历用户的声明集合并显示它们。这是* .cshtml页面中的代码,我在迭代声明,它工作正常:
@using System.Security.Claims;
@{
var currentPrincipalIdentity = (ClaimsIdentity)System.Threading.Thread.CurrentPrincipal.Identity;
}
@foreach (Claim claim in currentPrincipalIdentity.Claims)
{
<br/>@claim.Type : @claim.Value
}
除了来自Active Directory的这些声明之外,我还想从SQL Server数据库中获取一堆角色,并将它们作为角色添加到Claims集合中。我从旧的asp.net成员资格数据库中获取角色。作为第1步,我只想在SQL语句中对用户名进行硬编码(最终我需要弄清楚如何将用户名作为参数传递给SQL语句,但这将是第2步)。
首先,我给出了ADFS服务器在我的SQL Server上以读/写/执行权限运行的身份(当我取消这些权限时,我得到权限错误,这让我相信我的SQL语句正在执行)。
在我的AD FS中,我通过右键单击&#34;属性存储&#34;添加了SQL Server属性存储。节点,选择属性存储类型&#34; SQL&#34;,命名为&#34; SQLServer&#34;,并添加如下连接字符串:
Server=SqlDev01; Database=MyLegacyMembershipDatabase; Integrated Security=SSPI;
然后我选择&#34;信赖方信托&#34;文件夹,选择我感兴趣的信任,然后选择&#34;编辑索赔颁发政策。&#34;那里有一条有效的规则;它只是传回所有Active Directory声明。我可以在我的网页上看到所有这些声明(upn,name,windowsaccountname,我所有的团体sid等):
c:[]
=> issue(claim = c);
我尝试添加第二个自定义规则来读取旧会员数据库。在我的ADFS中,我点击&#34;添加规则&#34;,&#34;使用自定义规则发送声明&#34;,并将其添加为规则:
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"]
=> add(store = "SQLServer", types =
("http://schemas.microsoft.com/ws/2008/06/identity/claims/role"), query =
"select r.RoleName AS Role from dbo.aspnet_Roles r INNER JOIN
dbo.aspnet_UsersInRoles uir ON r.RoleId = uir.RoleId INNER JOIN
dbo.aspnet_Users u ON uir.UserId = u.UserId WHERE u.UserName = '[hard-coded
value here]' OR u.UserName={0}", param = c.Value);
它保存得很好,但是当我重新运行页面时没有任何变化;我仍然获得Active Directory声明的原始集合,但不是来自SQL Server的数据。
我确信SQL Server语句正在执行,因为如果我从SQL Server中删除ADFS运行的标识的权限,我会收到错误,如果我故意乱用SQL语法,我会收到错误。如果我扭转这些故意的错误,那么页面再次正常运行。但我从来没有看到我想在Claims系列中看到的角色。
根据我对自定义规则的理解,&#34; http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn&#34;作为参数传递给查询,这就是为什么我有上面的OR语句;我的最终目标是将用户的UPN作为参数传递给SQL查询。
我错过了什么或做错了什么?奖金问题 - 假设我这样做了,你能告诉我如何将用户的UPN作为参数传递给SQL查询吗?
答案 0 :(得分:0)
尝试“问题”规则而不是“添加”。