2011-07-20 118 views
10

我目前正在开发一个MVC3的Web应用程序,需要外部网用户登录和使用窗体身份验证进行身份验证。 Intranet用户应该使用Windows身份验证自动登录。
我发现这篇文章, http://aspalliance.com/553_Mixed_Mode_Authentication.all 但它的日期2004年11月,喜欢找东西写比7年前更近。ASP.NET混合形式/ Windows身份验证

我的计划是在IIS两个应用程序,在同一物理目录指向虚拟目录,而是一个将允许匿名访问和其他不会。

当用户对事物的的Windows/Intranet的端认证的,我希望能简单地模拟用户通过窗体身份验证登录。这种方法有没有陷阱?任何更好的想法?

编辑:2011/7/22

我使用IIS7这不会让我做很多的旧文章建议的事情。由于身份验证在IIS7和ASP.NET网站之间集成得比较严格,因此不允许使用某些内容。例如,我不能在单个文件上设置Windows身份验证,而应用程序的其余部分使用Forms Auth。

+0

你打算如何模拟用户使用表单登录?你打算在ASP会员表中为他们创建用户吗? – Erix

+0

是的。每个Windows用户都将拥有对应于asp成员资格中的用户的角色(Windows中的组)。因此,如果他们在Windows中的管理员组中,他们将以管理员用户身份登录到Forms中。对于Windows用户,只有与ASP成员表中的用户一样多的角色,每个角色都有一对一的关系(用户到角色)。 –

回答

3

想知道这里最好的办法不会有其中第一个应用程序使用Windows身份验证两个应用程序并只包括一个钩在HTTP管道PostAuthenticate事件。如果用户已通过身份验证,则会为他们提供表单工单并重定向到使用表单身份验证的目标应用程序App2。您必须小心,Cookie不是路径特定的,并且两个应用程序驻留在同一台服务器上(或者加密密钥在web.config中同步)。如果用户未通过身份验证,则只需重定向他们,而不需要身份验证票,并在到达App2时登录。

应用1:www.myUrl.com \ MyApp的

这是该应用的 “公共” 的网址,并通过挂钩到PostAuthenticate事件检测网络用户(见Professional ASP.NET 2.0 Security, Membership, and Role Management):

//Hook PostAuthenticateRequest inside of global.asax 
void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
{ 
    IPrincipal p = HttpContext.Current.User; 

    if (p.Identity.IsAuthenticated) 
    { 
     // to do: give them a non-path specific ticket and redirect to App2 
    } 
} 

App2:www.myUrl.com \ MyApp2

这是实际应用。当网络用户从App1到达时,他们已经有表格票。当非网络用户到达时,他们将被重定向到login.aspx。

备注: 如果网络用户为App2书签,其中一个缺点是。我不太清楚我将如何解决这个问题。如果他们有一个没有过期的cookie,那么没关系。一种选择是在登录页面上添加一个链接,说明“我已经是网络用户 - 自动登录我”,它将链接回App1,他们将在那里登录?

我有一些代码来协助发布表格票。我会随时更新答案。

请注意,你将不得不做一些花哨的角色管理步法的应用2来处理不同的角色提供。上面的亚马逊参考文献是旧的,但是当我遇到这些自定义的认证和授权问题时,我发现自己经常引用它。

+0

感谢您输入Brett。网络用户的登录并不重要,但客户需要登录。当我必须实现这个功能时,我会继续考虑我的选项,包括你的选项。 –

+0

我几乎走了这条路。要克服很多障碍,但它大部分都有效。我将Windows验证网站(Site1)的URL添加到本地Intranet站点域,以便用户自动登录,然后重定向到Site2。 –

0

这是完全可能的,如果您将在IIS中创建两个不同的应用程序,那么您的工作就完成了! =)

+0

不适用于IIS7。当您将IIS7中的应用程序从Forms更改为Windows身份验证(反之亦然)时,它会修改该项目的WebConfig。我将有两个应用程序,但它们都将指向文件中的同一物理目录。在一个应用程序中更改身份验证类型会影响其他身份。 –