我想知道是否可以利用.NET中的身份验证,成员身份和/或配置文件提供程序功能来帮助将.NET Web应用程序集成到我公司的企业门户中。简而言之,门户网站会将自定义标头值发送到门户网站“后面”的任何应用程序,例如用户名,用户配置文件数据和某些访问权限。我们与门户网站存在的一个问题是,我们无法利用网络上提供的许多.NET应用程序,因为它们并非设计为“门户感知”,主要是为了相信用户已经过身份验证。
是否有可能以某种方式编写自定义身份验证提供程序(或者可能以某种方式利用表单身份验证)来查看标题(加上IP)并自动“验证”该用户?我的想法是,通过编写配置文件提供程序,可能是成员资格提供程序,并以某种方式添加身份验证,我将能够下载酷的组件,如Oxite博客(我发现的.net mvc演示),将提供程序切换到我的自定义程序,以及杠杆它在我公司的门户网站后面,只需要很少的代码更改。
这有什么意义吗?我觉得我可能不理解这些组件如何适应这个难题。
答案 0 :(得分:3)
我不认为你可以对.Net应用程序进行零更改来做到这一点,但我认为你可以用最小的改动来做到这一点。请注意,我假设门户网关将要访问.Net Web应用程序。也就是说,门户网站从浏览器获取每个HTTP请求,向其添加自己的标头,将请求提交到.Net应用程序,从.Net应用程序获取回复,重写更多内容,然后将信息返回给浏览器
我猜测现在发生的事情(你写这个问题的原因)是你将这个.Net应用程序嵌入到门户网站上的一个portlet中,但当有人试图浏览它时,即使它们登录到你的门户网站,他们在portlet框中看到外部的.Net登录界面。不是很好。
这里需要采取两个步骤:
<强> 1。重新执行.Net应用程序的登录页面以自动登录portlet用户
找到.Net应用的登录页面。它可能就像login.aspx。将它(以及任何相关的代码隐藏文件)复制到portallogin.aspx和portallogin.cs。 打开portallogin.aspx和portallogin.cs文件。摆脱那里的所有控件和代码。将其替换为您在下面看到的内容。请注意,无论您何时看到PORTAL_SomeFunctionName,您都需要将其替换为Portal的SDK中的代码,以便进行适当的函数调用。
const string specialpassword = "ThisPasswordTellsTheBackendSystemThisUserIsOK";
Page_Load()
{
if (PORTAL_IsLoggedInToPortal())
{
string username = PORTAL_GetCurrentUserName();
// Authenticate the user behind the scenes
System.Web.Security.FormsAuthentication.SetAuthCookie(username, false);
System.Web.Security.FormsAuthentication.Authenticate(username, specialpassword);
}
else
{
throw new Exception ("User isn't coming from the Portal");
}
}
接下来,编辑.Net应用程序的web.config并告诉它登录页面是portallogin.aspx而不是login.aspx。
应该注意自动尝试登录用户。
<强> 2。创建与#1
一起使用的自定义成员资格提供程序您需要在此处创建自定义成员资格提供程序。为了使其正常工作,您正在使用的.Net应用程序必须使用成员资格提供程序并允许使用自定义成员资格提供程序。
创建新的会员提供商。您需要创建一个类并从System.Web.Security.MembershipProvider继承。至少,我认为您需要实现GetUser和ValidateUser函数以及ApplicationName属性。以下是他们看起来如何的一些想法。还有许多需要重写的函数,但是存根(带有附带的NotImplementedException(s))可能是单独存在的。
public override string ApplicationName
{
get
{
return "Portal";
}
set
{
;
}
}
private const string specialpassword =
"ThisPasswordTellsTheBackendSystemThisUserIsOK";
public override bool ValidateUser(string username, string password)
{
// If the password being passed in is the right secret key (same
// for all users), then we will say that the password matches the
// username, thus allowing the user to login
return (password == specialpassword);
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
string email = PORTAL_getemailfromusername(username);
System.Web.Security.MembershipUser u = new MembershipUser(
this.name, username, username, email, "", "", true, false,
DateTime.Now(), DateTime.Now(), DateTime.Now(),
DateTime.Now(), DateTime.Now(), DateTime.Now()
);
return u;
}
如果该功能有助于与此.Net应用程序集成,您也可以为.Net RoleProvider和ProfileProvider执行类似的实现。 (角色提供者将提供组成员资格信息,ProfileProvider将提供额外的个人资料信息,例如电子邮件地址,邮政编码或您希望它为每个用户提供的任何其他属性。这些信息必须从数据库或来自门户网站的HTTP标头信息。
其他注意事项
由于您正在为此外部.Net应用程序使用第三方身份验证提供程序,因此您需要弄清楚如何告诉此.Net应用程序哪些用户/组是管理员。我不能告诉你 - 你必须从第三方.Net应用程序中找到它。如果除了拥有帐户之外,在此.Net应用程序中执行任何操作所需的任何权限,则需要这样做。
由于您在门户网站中使用此功能,因此可以使用多种方法。您可以拥有一个显示整个.Net Web应用程序的大型portlet。您还可以使用许多小portlet来显示.Net Web应用程序的各个部分。无论哪种方式,当门户网站将一个完整的.Net应用程序放在门户网站页面上的一个小portlet框中时,你必须考虑到门户网站可能会或可能不会正确呈现内容。如果你看到看起来或工作奇怪的HTML,修复它会很烦人。您可以尝试修复原始.Net Web应用程序以吐出不同的HTML,或者您可以向IIS添加模块以便动态重写HTML(我不完全确定它是一个模块......您将拥有在IIS上挖掘一些以了解如何执行此操作)。
<强>呼!强>
我知道这并不涵盖所有内容,但我已经设置了Plumtree Portal(现在是BEA的Aqualogic用户交互)作为Microsoft SQL Server Reporting Services的身份验证源,我已经实现了自定义身份验证提供程序对于IIS,基于存储在Dynamics NAV表中的用户成员资格。希望我对这些项目的经验对您将此外部.Net应用程序与门户网站的集成有所帮助。
Tim
答案 1 :(得分:1)
我认为这是一个好主意。您肯定想要成员资格提供者,并确保您下载的所有.Net Web应用程序的身份验证都设置为“表单”。
同时检查IIS7,因为它新构建的管道意味着您可以在任何处理程序(CGI等)中利用基于.Net的身份验证类型。例如,您可以对PHP应用程序使用Windows身份验证。
答案 2 :(得分:0)
缺少其他答案的一个小问题是,asp.net中的表单身份验证支持交叉身份验证。
表单身份验证标记具有域名和Cookie名称属性。
匹配这些&amp;使用相同的机器密钥,将允许应用程序之间的交叉验证。
您的每个站点的成员资格提供程序都需要指向同一个数据存储区。