表单身份验证跨Windows身份验证

时间:2009-08-25 03:11:43

标签: .net asp.net forms-authentication windows-authentication

我有一个我正在研究的网站,它同时具有内部网和互联网部署。 2之间的唯一区别是几个配置设置。

互联网版本工作正常,因为它只使用表单身份验证(在其Web配置中定义),如果未登录,则用户将被定向到登录页面。

Intranet版本有点棘手......当用户第一次访问该站点时,使用WindowsPrincipal正确设置了http上下文原则对象,但是使用该信息我确认允许用户访问该应用程序然后我创建我自己的IPrinciple实例。

鉴于此,我想在这里做一些事情...我想使用WindowsPrincipal对象作为验证用户的基础,但从那时起使用表单身份验证(即使用cookie来存储身份验证细节等)。我还需要从HTTP上下文检索的原理实例是我的IPrinciple类型。

我最好怎么做呢?因为我应该看看global.asax的Session_Start来执行auth逻辑然后以某种方式让它来存储我的自定义IPrinciple(所以对于那之后的任何请求实例是我的自定义原则)或者我最好用Application_AuthenticateRequest做某事

干杯 安东尼

1 个答案:

答案 0 :(得分:2)

避免使用会话对象。 Application_AuthenticateRequest是您想要的地方。在那里,您可以使用WindowsPrincipal,然后转到数据库以填充您自己的自定义IPrincipal实现对象。这意味着Application_AuthenticateRequest会被调用很多,所以在我的应用程序中,我倾向于将角色数据缓存至少几秒钟以减少数据库往返。这也适用于Forms身份验证。这两种方法之间的唯一区别是,在Forms方案中,您从Forms auth模块获得GenericPrincipal,并且您将使用它来检索您自己的自定义主体对象而不是WindowsPrincipal。

在Application_AuthenticateRequest中设置HttpContext.Current.User的另一个结果是,与将主体放在Session对象中不同,您可以使用声明性安全性,例如使用PrincipalPermissionAttribute修饰方法。