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

时间:2011-10-08 02:04:45

标签: 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. 网站和app web.configs
  2. 中的<authentication mode="Forms">相同
  3. 相同的<machineKey>部分(是的,相同的validationKey和decryptionKey)
  4. 所以我接着检查了生成的cookie,发现网站和网络应用程序似乎正在处理不同的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 Authentication 以及 http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

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

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

2 个答案:

答案 0 :(得分:2)

好的,所以我能够在打了很长时间之后回答我自己的问题。

基本上,BlogEngine.NET 2.5(我的web-app)似乎重写了.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)。如果您想知道如何实施拥有站点范围的身份验证,这是一个超级快速的指南

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

我还必须在网站web.config以及web-app web.config中添加类似这样的内容,因此无论何时访问受保护资源(来自网站或网络应用程序),我自己的global / 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上进行身份验证的用户在博客实例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-app web.configs(应该匹配!)

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

答案 1 :(得分:1)

此外:在两个web.configs中,您必须使用相同的validationKey和相同的decryptionKey插入machinekey。

相关问题