3

我想知道是否可以利用 .NET 中的身份验证、成员资格和/或配置文件提供程序功能来帮助将 .NET Web 应用程序集成到我公司的企业门户中。简而言之,门户将自定义标头值发送到门户“后面”的任何应用程序,以获取用户名、用户配置文件数据和一些访问权限等字段。我们在门户中遇到的一个问题是,我们无法利用 Web 上可用的许多 .NET 应用程序,因为它们的设计初衷不是“门户感知”,主要是为了相信用户已经过身份验证。

是否有可能以某种方式编写自定义身份验证提供程序(或者可能以某种方式利用表单身份验证)来查看标头(加上 IP)并自动“身份验证”为该用户?我的想法是,通过编写一个配置文件提供程序,可能是一个会员提供程序,并以某种方式添加身份验证,我将能够下载像 Oxite 博客(我找到的 .net mvc 演示)这样很酷的组件,将提供程序切换到我的自定义提供程序,并利用它在我公司的门户后面,代码更改最少。

这有道理吗?我觉得我可能不理解这些组件是如何融入这个谜题的。

4

3 回答 3

3

我不认为你可以通过对 .Net 应用程序进行零更改来做到这一点,但我认为你可以通过最小的更改来做到这一点。请注意,我假设门户网关将所有内容都发送到 .Net Web 应用程序。也就是说,门户从浏览器获取每个 HTTP 请求,向其中添加自己的标头,将请求提交给 .Net 应用程序,从 .Net 应用程序获取回复,重新编写一些内容,然后将信息返回给浏览器.

我猜现在发生的事情(你写这个问题的原因)是你将这个 .Net 应用程序嵌入到你的门户网站上的一个 portlet 中,但是当有人试图浏览它时,即使他们已经登录到你的门户网站,他们也会看到Portlet 框内的外部 .Net 登录屏幕。不大好。

这里需要采取两个步骤:

  1. 重做 .Net 应用程序的登录页面以自动登录 portlet 用户
  2. 创建与 #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
于 2009-07-06T19:20:46.403 回答
1

我认为这是个好主意。您肯定需要 Membership 提供程序,并确保您下载的所有 .Net Web 应用程序的身份验证设置为“表单”。

还可以查看 IIS7,因为它新构建的管道意味着您可以在任何处理程序(CGI 等)中利用基于 .Net 的身份验证类型。例如,您可以对 PHP 应用程序使用 Windows 身份验证。

于 2009-02-03T05:07:06.607 回答
0

缺少其他答案的一个小问题是asp.net中的表单身份验证支持交叉身份验证。

表单身份验证标记具有域和 cookie 名称属性。

匹配这些并使用相同的机器密钥,将允许应用程序之间的交叉身份验证。

但是,每个站点的成员资格提供程序都需要指向同一个数据存储。

于 2012-08-30T06:47:29.330 回答