2009-08-25 177 views
3

我有一个网站,我正在研究的内部网和互联网部署。 2之间的唯一区别是几个配置设置。表单身份验证跨Windows身份验证

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

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

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

我最好怎么去做这件事?在我应该看看global.asax的Session_Start执行授权逻辑,然后以某种方式获得它来存储我的自定义原则(因此对于任何请求之后,该实例是我的自定义原则)还是我最好用Application_AuthenticateRequest 。

干杯 安东尼

回答

2

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

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

+0

你能否回答http://stackoverflow.com/questions/9588265/understanding-wcf-windows-authentication? – Lijo 2012-03-06 18:13:08