2

我有以下结构ASP.NET 4.0单点登录失败

www.website.com - > ASP.NET 4.0的Web站点

WWW NET 4.0,Web应用程序

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

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

于是我检查了生成的cookie,并注意到网站和网络应用似乎在处理不同的cookie。通过website.com/blog

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

饼干创建由website.com

饼干

  • .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

好的,所以我能够在更长的时间周围回答我自己的问题。

基本上,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应用程序/ 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应用程序web.config,所以任何时候访问受保护的资源(从网站或Web应用程序)我自己的全局/登录/ Aspx被使用。

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

现在,我自己一般,整个网站的用户登录控件将被创建(.NET框架标准)认证cookie和(用户)角色饼干。通过避免使用BlogEngine.NET的login.aspx,我们更清洁,并且避免调用这个有问题的代码。

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

详情:该代码添加了一个“博客实例”到Cookie,所以所以如果你有在同一个域中的多个博客,这样可以防止用户1认证的博客实例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的处理的所有登录
  • 所有身份验证Cookie 用户角色的Cookie,上述网站广泛login.aspx的
  • 加密,每两个网站& web应用web.configs的保护,所有这些创建的cookie(其应该匹配!)

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

+0

我建议看看如果你不能让你的修改变得可配置并让维护人员接受它。在我看来,它主要是在同一个域上的多个引擎之间进行权衡,并且单点登录 - 您可能必须选择其中一个或另一个,但用户不应该为了使其正常工作而进行调试...... – jmoreno

1

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

0

很好研究。我下载了源代码并创建了mods。不幸的是,我无法让它工作。我研究了源代码,你的建议似乎完全合理。我对自己的处境感到不知所措。无论如何,感谢分享。

+0

谢谢。检查jmoreno的答案也是。 machine.config/web.config中的不同覆盖键可能会导致错误。希望能帮助你。 – DeepSpace101

+0

原因是.net 4.0和.net 4.5之间存在加密更改。 –

+1

我在blogengine源代码中配置了单点登录,并且拉请求被接受到主分支中。所以在web.config中,您设置BlogEngine.SingleSignOn = true以获得所需的行为。 –