1

我有一个带有诸如“www.domain1.com”之类的 URL 的 asp.net MVC 4 Web 应用程序,以及一个用于 ssrs 报告的新 asp.net Web 表单应用程序。asp.net Web 表单应用程序使用另一个 URL 作为“www.domain2.com”。为了让用户查看报告,将创建一个名为“报告”的新链接,从 asp.net MVC Web 应用程序站点到新的 asp.net Web 表单应用程序站点。

2 个 Web 应用程序位于同一台服务器上。使用这 2 个 Web 应用程序的用户坐在同一台 PC 上。

问题 1:我想要:如果某个用户成功登录 MVC 应用程序站点,他应该在按下 Reports 链接后自动登录 Reports asp.net Web 表单站点。我怎样才能做到这一点?

问题 2 :一旦用户自动登录,如何防止“.ASPXAUTH” cookie(用于检查用户身份验证)在第二个站点(域为“www.domain2.com”的 Web 表单应用程序)中丢失以下场景:

  • 逐页导航。
  • F5 刷新/重新加载一些 Web 表单页面。
  • 在浏览器(IE、FF、Chrome 或其他)中点击后退和前进按钮。

PS我已经阅读了以下线程,但是对于 asp.net 的答案尚不清楚,或者没有给出明确的详细信息:

如果用户登录到另一个网站,则自动登录到当前网站

4

2 回答 2

2

您需要研究的短语是Single Sign On。如果您需要强大并为大量公共用户提供服务并且您的域具有不同的名称,这并不简单。在封闭的环境中,它变得更容易,因为您不必考虑所有变量,您知道您支持哪些浏览器等。

您可以使用WSFederation、OAuth 提供程序,例如GoogleLive,或者您可以实现您的站点都可以访问的共享身份验证服务。但是,有一些限制:您使用两个单独的域的具体要求会让您非常困难。您还可以查看基于声明的身份,这可能会改变您的方法并使您更容易做到这一点。

###更简单的单点登录(共享域或子域)

我也会在这里看看更简单的案例,尽管如果你的问题是从字面上理解的,你可能无法做到这一点。但是,您可以看到您的选择是什么,也许您可​​以更改您的域名(或至少使用子域)。对于网站:

  • 在不同子文件夹(www.domain1.com/site1www.domain1.com/site2)中的同一域上,这很容易,并且这种方法可以完美地工作。
  • 在同一个域的子域(site1.domain1.com 和 site2.domain1.com)中,它有点难,但你仍然可以让它工作。

基本方法是:

  • 在两个 web.config 文件中将用于身份验证的机器密钥设置为相同

  • 如果使用不同的子域:修改您的 FormsAuthentication cookie,以便在您登录后同时用于 site1.domain1.com 和 site2.domain1.com

     // after successful login in your login action (and in any other place, such as Register):
     HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName, 
     authCookie.Domain = "example.com"
     Response.AppendCookie(authCookie);
    
  • 如果您让用户在任一站点而不是主站点登录,请使用共享身份验证数据库

但是请注意,由于浏览器的限制,用于身份验证的共享 cookie 变得越来越困难,这是Jeff Atwood 本人在 Global Network Auto-Login中所写的。在“SO 的新自动登录功能如何工作?”中,对可能的方法进行了全面考虑。. 因此,同样,如果您只需要支持一个封闭的环境(例如您的办公室,或使用一组已知浏览器的一小部分客户),您的生活会更轻松。

共享身份验证令牌和查询字符串

如果您有勇气,并且可以设置共享数据库或服务,这也是可能的。

当用户在 site1.com 上成功登录时,您可以在数据库中为该登录设置一个一次性令牌,并将该令牌的详细信息放入 cookie。当它们被传递到站点 2 时,您可以在查询字符串中传递该一次性令牌,然后在站点 2 中,您可以检查它们传递的令牌是否有效。如果是,那么您可以让他们登录并设置他们的登录 cookie。您需要注意这一点,在查询字符串中传递本质上是身份的内容时需要考虑安全性。

脚注

有一本很棒的基于声明的身份验证的在线 MS 书籍,名为“基于声明的身份和访问控制指南”(注意:pdf 链接),我已将其添加为脚注,以防链接失效。

于 2013-05-30T16:51:40.737 回答
1

这不是一个简单的情况,需要使用 WS-Federation 或 OAuth。基本上,您需要登录到第三个网站。而且您的两个网页必须将未经身份验证的请求重定向到该页面。

这不会使您同时在两个页面上进行身份验证,但会使其看起来像您一样。您将拥有 3 个不同的 cookie/会话,但只需一次将您的凭据传递到第三个网站即可。

Microsoft 在其 Windows Identity Foundation 中为您提供了 WS-Federation 的实现。

以下是 WIF Workshop 的录音,我建议您查看。

在这里您可以找到将 ASP.NET MVC 与 WIF 混合使用的提示。

至于带有 ASP.NET MVC 的 OAuth,这里有一些看起来很有希望的文章。

于 2013-05-30T16:32:42.017 回答