首先,Windows Identity Foundation是微软提供的一种利用基于声明的身份验证的方式。根据MSDN的定义,Windows Identity Foundation允许.NET开发者将身份逻辑从应用程序中分离出来,提高开发人员的生产力,增强应用程序的安全性,并实现互操作性。
通过使用WIF,开发者可以:
简而言之,Windows Identity Foundation提供了一套类库,以便于实现基于声明的身份验证。
要使用WIF,需要Windows 2003服务器或更高版本,或者Windows 7/8/Vista。可以从以下链接下载WIF:
WIF SDK提供了一些Visual Studio模板,有助于开发基于声明的应用程序。这些模板包括:
这些模板可以在文件菜单下的新建网站中找到。
今天,将创建一个ASP.NET应用程序(依赖方应用程序-RP)。同时,将创建一个自定义身份提供者,并使用此身份提供者对用户进行身份验证。以下是需要执行的主要步骤:
在这里,将逐步创建一个自定义身份提供者。
创建了一个ASP.NET应用程序,如下所示:
这可以通过WIFSDK提供的FedUtil来完成。此外,从UI中,可以在ASP.NET网站中添加一个STS引用,并在身份提供者和依赖方之间建立信任关系。以下是添加引用的步骤:
注意:在这里有一个选项可以定期更新联合元数据。如果STS发生了变化,例如令牌或声明等,需要知道。RP只有在联合元数据更新时才会知道,否则,如果有人移除了一个声明并且元数据没有更新,它将允许获取该声明,但实际上在运行时将不会获得该声明,这将不是一个好情况。应该始终保持元数据的最新状态。
点击完成后,将向ASP.NET网站(依赖方-RP)添加一个名为FederationMetadata的文件夹,如下所示:
现在,如果运行应用程序,它将抛出一个异常,因为“由于代码已优化或调用堆栈顶部有一个本地帧,无法评估表达式。”这是一个问题,已经为此做了一个小帖子。可以轻松解决它。请查看。
更改后,它将顺利运行,并将带到由STS提供的登录页面。这是STS提供的默认登录页面,不需要输入密码,只需输入一个名称并点击登录,如下所示:
它将重定向到另一个页面到STS,这将实际启动创建令牌和声明的过程。创建完成后,它将作为经过身份验证的用户传输到网站。
现在应用程序正在运行。由于在STS中有一个使用表单身份验证的示例登录页面,默认情况下会验证每个用户。在这里,可以编写代码,无论否想使用Windows身份验证/表单身份验证来验证用户,并使用数据库,都可以,并且也可以获取一些用户的数据,例如从数据库中,然后可以按照要求使用声明发送。
现在,将展示如何向用户传递更多信息到声明中。所以,一个人可以在这里获得额外的声明。当创建一个STS时,会在App_Code文件夹中添加四个文件。一个名为CustomSecurityTokenService.cs的文件。在该文件中,有一个名为GetOutputClaimsIdentity的方法,它实际上创建了声明。需要在这里添加声明(添加了一些):
protected override IClaimsIdentity GetOutputClaimsIdentity(IClaimsPrincipal principal, RequestSecurityToken request, Scope scope)
{
if (null == principal)
{
throw new ArgumentNullException("principal");
}
IClaimsIdentity claimsIdentity = (IClaimsIdentity)principal.Identities[0];
ClaimsIdentity outputIdentity = new ClaimsIdentity();
// Issue custom claims.
Update the application's configuration file too to reflect new claims requirement.
outputIdentity.Claims.Add(new Claim(System.IdentityModel.Claims.ClaimTypes.Name, principal.Identity.Name));
outputIdentity.Claims.Add(new Claim(ClaimTypes.Role, "Manager"));
// I added these custom claims
outputIdentity.Claims.Add(new Claim(ClaimTypes.Email, "brij@gmail.com"));
outputIdentity.Claims.Add(new Claim(ClaimTypes.Gender, "Male"));
return outputIdentity;
}
添加了两个声明(Email,Gender),如上所示。这些声明将在ASP.NET网站(依赖方)中可用。