ASP.NET 4.0 父网站和子 Web 应用程序之间的单点登录失败

标签 asp.net single-sign-on blogengine.net form-authentication

我有以下结构

www.website.com --> ASP.NET 4.0 网站

www.website.com/blog --> NET 4.0,Web 应用程序

两者都针对相同的 SQL 数据库进行表单例份验证,并使用框架 ASP.NET 成员资格和角色。我可以很好地登录每个部分(相同的用户/密码),但身份验证不会继续下去,即如果我登录 /然后单击 /blog/ 的链接, /blog/认为我是匿名并提示再次登录。我已经完成了基础知识

  1. 相同<authentication mode="Forms">在网站和应用程序的 web.configs 中
  2. 相同<machineKey>部分(是的,相同的validationKey和decryptionKey)

然后我检查了生成的 cookie,发现网站和 Web 应用程序似乎在不同的 cookie 上运行。

由 website.com/blog 创建的 Cookie

  • .ASPXFORMSAUTH-27604f05-86ad-47ef-9e05-950bb762570c
  • .ASPXROLES

由 website.com 创建的 Cookie

  • .ASPXFORMSAUTH

我认为这就是问题所在,尽管我看到了它,尽管有相同的 <authentication>看起来像

的部分
<authentication mode="Forms">
    <forms timeout="30" slidingExpiration="true" name=".ASPXFORMSAUTH" enableCrossAppRedirects="true" protection="All" cookieless="UseCookies"/>
</authentication>

我确实读过其他几篇文章,例如 Single Sign On with Forms Authenticationhttp://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

还有一些其他帖子我现在记不起来了。我已经完成了它们(全部?),但仍然卡住了。如果需要,我很乐意提供更多调试数据。

非常感谢有人提供的任何建议!我想我在这件事上碰壁了!

最佳答案

好的,经过长时间的思考,我终于能够回答我自己的问题了。

基本上,BlogEngine.NET 2.5(我的网络应用程序)似乎覆盖了 .NET 4.0 框架的处理方式。您需要修复一些问题,所有这些都在 BlogEngine.Core\Security\Security.cs 中(下载 BlogEngine.NET 源代码)

第 1 部分:修复 cookie 名称

其中有一个 FormsAuthCookieName 方法,我对其进行了如下更改:

File: BlogEngine.Core\Security\Security.cs
Method: FormsAuthCookieName()
// return FormsAuthentication.FormsCookieName + "-" + Blog.CurrentInstance.Id.ToString();
return FormsAuthentication.FormsCookieName;

这可确保 Cookie 名称相同。下一关...

第 2 部分:避免使用 web-app/BlogEngine.NET 的登录页面/控件/代码

我没有引导用户登录 BlogEngine.Net 的 login.aspx (www.website.com\blog\account\login.aspx),而是将所有登录链接指向我的主网站登录。 aspx 页面 (www.website.com\login.aspx)。如果您想知道如何实现自己的站点范围的身份验证,这是一个 super 快速指南

msdn.microsoft.com/en-us/library/ff184050.aspx. 

我还必须将类似的内容添加到网站 web.config 以及网络应用程序 web.config 中,因此每当(从网站或网络应用程序)访问 protected 资源时,我自己的全局/login/aspx已使用。

<authentication mode="Forms">
<forms timeout="30" loginUrl="/login.aspx" blah blah />
</authentication>

现在,我自己的通用站点范围用户登录控件将创建(.NET 框架标准)身份验证 cookie 和(用户)角色 cookie。通过避免 BlogEngine.NET 的 login.aspx,我们变得更干净,而且我们避免了调用这个有问题的代码。

File: BlogEngine.Core\Security\Security.cs
Method: AuthenticateUser(string username, string password, bool rememberMe)

详细信息:该代码将一个“博客实例”添加到 cookie 中,因此,如果您在同一域上有多个博客,这会阻止在博客实例 1 上进行身份验证的 user1 不被验证。在博客实例 2 上自动进行身份验证。我猜大多数人每个域只有一个博客(www.domain.com\blog!),所以这是不必要的。更重要的是,该检查破坏了我们的单点登录。

两个障碍......

第 3 部分:修复每次访问授权检查

现在,我们的站点范围内的标准化 login.aspx 不会添加特定的 BlogEngine.NET 实例 ID(见上文)。这本来是可以的,只是仍然有一些专门寻找它的 BlogEngine.NET 代码。我们也不需要该检查,所以让我们删除该有问题的检查...

File: BlogEngine.Core\Security\Security.cs
Method: void Init(HttpApplication context)
// Comment line below to revert to only-framework/default processing
//context.AuthenticateRequest += ContextAuthenticateRequest;

所以此时你应该已经

  • 所有登录均由单个站点范围的 login.aspx 处理
  • 由上述站点范围的 login.aspx 创建的所有身份验证 Cookie用户角色 Cookie
  • 所有此类 Cookie 均根据网站和网络应用程序 web.config 进行加密和保护(应匹配!)

这又允许单点登录:)!!万岁!

关于ASP.NET 4.0 父网站和子 Web 应用程序之间的单点登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7694334/

相关文章:

c# - 如何正确配置此 IIS 7.5 子应用程序?

c# - 使用分页对 Gridview 列求和

.net - 为什么不直接对引用进行源代码控制?

coldfusion - 使用 SSO 从 Google Apps 登录到我现有的应用程序

.net - ASP.NET的BlogEngine.Net是否可以叠加到Wordpress?

c# - .Net 4.0 System.Web.Security.MembershipProvider 引用不明确?

asp.net - jQuery:单击 ASP.NET ImageButton 时淡出图像

c# - 限制路由到 ASP.NET Core 中的 Controller 命名空间

ios5 - pushViewController 不能在 iOS 5 上启动 GTMOAuth2ViewControllerTouch

java - CAS服务器未返回任何响应