将WIF STS服务添加到现有项目

时间:2011-09-21 21:25:26

标签: c# .net asp.net wcf wif

我们有几个以下列方式设置的网站:

Site1.Web - ASP.NET Web项目(.NET 4.0,WebForms) Common.Core - 类库项目(所有数据库交互)

每个站点都会显示一次Web项目,而Common.Core项目在所有站点之间共享。我们在Web项目中有一个登录表单,为了进行身份验证,可以调用类库。它将取消类似于下面的代码:

Common.Core.Authenticate auth = new Common.Core.Authenticate(conStr);
bool validLogin = auth.ValidateUser(userName, password);
if(validLogin)
{
    Common.Core.User = auth.GetCurrentUser();
}

高层人士正在推动中间层服务/应用层,并希望使用更优雅的解决方案来处理单点登录。因此,已决定使用WIF服务来处理登录和验证。此外,我们希望尽量减少每个Web项目中必须更改的代码,即尽量在Common.Core中保留尽可能多的更改。

我看过一些示例,展示了如何向Web项目添加STS引用。这在用户验证没有被分解到另一个项目(如Core.Common)的场景中效果很好。但是,在我们的场景中,我们如何在仍然通过公共类库的同时处理验证?

理想情况下,我想向Core.Common类库添加一个STS引用,并用调用STS服务替换直接数据库逻辑(上面的auth.ValidateUser)。但是,甚至可以这样做吗?请求是否必须在Web项目中启动?如果是这样,两个地方都需要STS参考吗?

遵循相同网络项目的任何教程或资源 - >类库 - > STS服务路径将不胜感激。

2 个答案:

答案 0 :(得分:1)

实现这一目标的一种方法是使用ADFS实例为FedUtil提供ASP.NET项目。从本质上讲,身份验证现在“外包”,您只需从应用程序中删除对核心库的调用。然后设置ADFS以返回程序授权所需的任何属性作为声明。您可能需要将这些声明属性转换为在后续调用中传递回公共核心的任何属性。

或者你可以使共同核心“声称感知”,因为它现在承认“声明属性”而不是“共同核心”属性。这涉及使用不同的.NET类 - 不需要与ADFS连接。

警告词 - 您的身份验证似乎与数据库相关。 ADFS无法对数据库进行身份验证。它只能对安装了ADFS的域中的AD实例进行身份验证(如果AD之间存在信任关系,则可以对其他AD进行身份验证)。

如果要对数据库进行身份验证,则需要自定义STS,然后将其与ADFS联合。见这里:Identity Server.

答案 1 :(得分:1)

我还建议使用WIF: - )

在基于声明的方案中,身份验证过程是“逆转”的。您的应用程序不会呼叫任何人,它将从受信任的来源(STS)收到所需的信息。

“STS参考”不是库参考。它是您的应用程序与受信任的安全令牌源之间的逻辑连接。令牌是您的应用将用于决定如何处理用户请求的工件。

我同意@nzpcmad,你很可能完全删除对Common.Core库的调用。看看你还能做些什么可能会有用。 Common.Core.User 对象提供什么?

如果只是用户的属性(例如姓名,电子邮件,角色等),您很可能只需创建一个简单包装 IPrincipal <的新版本/ strong>由WIF提供( ClaimsPrincipal )。

例如(大约没有错误处理,伪代码):

public User CurrentUser()
{
    var user = new User();
    var cu = HttpContext.Current.User as IClaimsPrincipal;
    user.Name = cu.Name;
    user.eMail = (cu.Identity as IClaimsIdentity).Claims.First( c=> c.ClaimType = "eMail" ).Value;
    return user;
}

正如@nzpcmad所说,您可以使用ADFS或其他一些STS。您的应用无关紧要。