我认为您无法通过对 .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