我不认为你可以通过对 .Net 应用程序进行零更改来做到这一点,但我认为你可以通过最小的更改来做到这一点。请注意,我假设门户网关将所有内容都发送到 .Net Web 应用程序。也就是说,门户从浏览器获取每个 HTTP 请求,向其中添加自己的标头,将请求提交给 .Net 应用程序,从 .Net 应用程序获取回复,重新编写一些内容,然后将信息返回给浏览器.
我猜现在发生的事情(你写这个问题的原因)是你将这个 .Net 应用程序嵌入到你的门户网站上的一个 portlet 中,但是当有人试图浏览它时,即使他们已经登录到你的门户网站,他们也会看到Portlet 框内的外部 .Net 登录屏幕。不大好。
这里需要采取两个步骤:
- 重做 .Net 应用程序的登录页面以自动登录 portlet 用户
- 创建与 #1 一起使用的自定义成员资格提供程序
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。您还可以拥有许多显示 .Net Web 应用程序的点点滴滴的小 portlet。无论哪种方式,您都必须考虑,当门户网站将完整的 .Net 应用程序放在门户网站页面上的一个小 portlet 框内时,门户网站可能会或可能不会正确呈现事物。如果你得到的 HTML 看起来或工作起来很奇怪,修复它会很烦人。您可以尝试修复原始的 .Net Web 应用程序以吐出不同的 HTML,或者您可以向 IIS 添加一个模块以动态重写 HTML(我不完全确定它是一个模块......你会有在 IIS 上挖掘一些内容以了解您如何执行此操作)。
哇!
我知道这并不能涵盖所有内容,但我已经将 Plumtree 门户(现在是 BEA 的 Aqualogic 用户交互)设置为 Microsoft 的 SQL Server Reporting Services 的身份验证源,并且我已经为基于 IIS 的自定义身份验证提供程序实现了存储在 Dynamics NAV 表中的用户成员资格。希望我在这些项目方面的经验能够帮助您将此外部 .Net 应用程序与您的门户网站集成。
Tim