MVC3松散耦合的身份验证

时间:2012-01-09 14:50:14

标签: asp.net-mvc-3 forms-authentication windows-authentication custom-authentication

开箱即用的MVC3应用程序在使用Intranet项目模板或Internet项目模板的表单身份验证时允许Windows身份验证。我有一个我想要使用的网站。此外,我有一个现有的站点,它使用它自己的自定义身份验证类型来验证用户(没有授权或角色,只是识别)。除了来自遗留系统的数据进行身份验证之外,我可能还需要使用每个功能。因此,我试图确定一种抽象我的身份验证并将其解耦的方法。我想完全基于配置使用某种依赖注入,因此我可以在两个不同的位置部署同一个站点,并通过仅更改配置来切换身份验证模型(Windows Auth / Forms Auth / Custom Auth)。

目前,我使用的所有ASP.NET应用程序(包括MVC3模板项目)似乎都与使用的身份验证类型紧密耦合。

我在这个盒子外面想得太远吗?

这是可能的,还是有这种紧耦合的原因?

更新 我遇到的真正问题是我需要为某些用户使用的现有遗留身份验证与我需要的其他身份验证之间的身份验证。 由于没有使用LogIn表单,因此Windows与Forms身份验证不是真正的问题。但请考虑自定义身份验证和表单身份验证。 LogIn表单与FormsAuthentication紧密耦合,更具体地说,与System.Web.Security紧密耦合。 (即Membership.ValidateUser,FormsAuthentication.SetAuthCookie等......)。

我想在我的AccountController中注入要使用的身份验证,而不是使用FormsAuthentication和Membership。

到目前为止,这对我的问题更有意义吗?

2 个答案:

答案 0 :(得分:1)

他们实际上没有那么紧密耦合。模板只是试图让您快速启动并运行。

ASP.NET成员资格支持Forms和Domain auth。

在为Forms身份验证配置的网站中,例如,您会在Web.config中看到一行:

<authentication mode="Forms">

您可以将其更改为:

<authentication mode="Windows">

这不是唯一的区别(使用Windows身份验证,例如,您不需要登录页面),但这是最重要的。您可以基于ASP.NET Membership API编写代码,并且仅在必要时才对目标进行Forms身份验证。

答案 1 :(得分:1)

我同意克雷格的回答。我唯一需要补充的是,我认为你可以在web.config中改变的任何东西都是松散耦合的。原因是您可以在为MVC应用程序创建部署包时应用web.config transforms

我们使用Unity for DI / IoC,您还可以使用Unity在web.config中指定注入依赖项。您只需编写Web.Auth1.config以配置应用程序以进行一种身份验证,并将Web.Auth2.config配置为另一种身份验证。然后在部署时,只需选择目标,VS就会为您构建正确的配置。

如果您的源代码需要知道部署中使用了哪种类型的auth,您可以使用web.config appSetting告诉它,也可以在部署期间使用web.config转换进行更改。