2

我有以下结构

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

www.website.com/blog --> NET 4.0,网络应用

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

IE

  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>

我确实阅读了其他几篇文章,例如 使用表单身份验证的单点登录 以及 http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

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

非常感谢有人可能提供的任何提示!我想我在这个问题上撞墙了!

4

2 回答 2

2

好的,所以在绕开它更长的时间后,我能够回答我自己的问题。

基本上,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),而是将所有登录链接指向我的主网站的 login.aspx 页面 (www.website.com\login .aspx)。如果您想知道如何实现自己的站点范围的身份验证,这是一个超级快速的指南

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

我还必须在网站 web.config 和 web-app web.config 中添加类似的内容,因此无论何时(从网站或 web 应用程序)访问受保护的资源,都会使用我自己的全局 /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.configs 进行加密和保护(应该匹配!)

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

于 2011-10-11T05:51:00.133 回答
1

另外:在两个 web.configs 中,您必须插入具有相同验证密钥和相同解密密钥的机器密钥。

于 2013-01-06T20:39:55.610 回答