.NET 4.5,MVC 5:ClaimsAuthenticationManager,IAuthenticationFilter,OWIN Forms Authentication和ClaimsPrincipals自从我上次触及我网站的身份验证功能以来都是新的。我发现在这个或 是正确的方式的所有文档中都缺乏明确性。我甚至不知道哪些功能是相互排斥的。
This document表示旧的ASP.NET FormsAuthenticationModule
不支持声明,但新的OWIN不支持无Cookie。然而,我觉得OWIN打算成为前进的功能?
在正确的方向上推进将会受到赞赏,我的大脑就是在炒这个。
答案 0 :(得分:4)
以前在MVC中,IAuthorizationFilter
是执行自定义身份验证的常见位置。可以在应用程序具有两个授权规范和仅一个身份验证规范的情况下看到此过滤器的原因。两个选项 - 将身份验证规范添加到单个任意授权例程,并将所有这三个规范创建为不同的IAuthorizationFilter
- 这两个选项都意味着我们无法确保首先进行身份验证。
IAuthenticationFilter
最初添加到MVC程序集中以解决此问题,然后重新定位以供WebAPI使用。这里有一篇很好的相关文章; ASP.NET Web API Security Filters
严格地说,IAuthenticationFilter
和OWIN身份验证不是互斥的,但OWIN身份验证将首先发生,并且可能妨碍任何使用它们的意图。
OWIN表单身份验证是一个令人困惑的短语,我从阅读一篇错误的文章(上面链接)得到。它代表两个非依赖的解决方案组件:
解决方案的“表单”方面仍然与之前的表单身份验证操作相同。这是授权失败的结果(例如从[Authorize]
属性或web.config
<authorization>
元素发生的)与重定向到登录处理程序表单的结果。 (您选择的技术将决定您配置重定向网址的位置。对于OWIN,您将在CookieAuthenticationOptions
中对其进行配置。)
“OWIN”方面与引起我的OP的混乱更为相关。我不会广泛地详细介绍OWIN,因为它的意义不仅仅是认证;完全将ASP.NET与IIS分离(通过OWIN),它产生了许多优点和缺点,但MVC6是专门在OWIN上构建的,所以它就在这里。
特定于身份验证,ASP.NET外部身份验证提供程序(Facebook / Google社交登录)等当前模块依赖于OWIN。如果您编写ASP.NET Web身份验证the "normal" way,您将使用OWIN。这是通过OWIN进行身份验证的好处。
以前,社交登录采用更加拼凑的方式作为重定向和MessageHandler
称为OAuthWebSecurity
。 OWIN提供了一种重定向和处理身份验证提供程序回调的机制;阅读Creating Custom OAuth Middleware for MVC 5了解更多信息。
ClaimsAuthenticationManager
听起来并不是真的。它实际上是由Windows Identity Foundation(WIF)执行的身份验证过程的尾端方面。它旨在转换由该流程生成的声明,以满足您的自定义需求。例如,声明列表可能包含用户名,您可以从数据库中查找经常访问的角色或权限,并出于性能原因将这些用户名添加到声明列表中。
适用于任何使用WIF的地方。相对于当前的ASP.NET Web应用程序,这意味着OWIN。
呀。您可能会在现代ASP.NET Web应用程序中使用OWIN,WIF和cookie。如果您使用“盒装材料”,以及此版本中WebForms和VB.NET的死亡,那就接受了。
所以,既然你可能正在进行OWIN身份验证,那么这是一个关于该主题的优秀系列; What’s this Owin Stuff About?
答案 1 :(得分:3)
OWIN更大的范围是最小化服务网页的堆栈,最小化堆栈是未来的新浪潮(ala node.js)。 “OWIN身份验证中间件”就是你所指的,而 Brock Allen 在这里说得最好:
使用.NET 4.5.1,对于ASP.NET应用程序,所有底层代码 处理“个人用户帐户”(以及中的模板) Visual Studio 2013)是新的。这意味着基于cookie的身份验证 我们不再使用Forms身份验证和外部身份 提供商,我们不再使用DotNetOpenAuth。
替换是一个名为OWIN认证中间件的框架 它的目标是OWIN API。我不打算在这里激励OWIN (这是一篇关于这个主题的好文章),但简而言之,这是一个抽象 Web主机的API。许多框架,如Web API和SignalR(如 以及其他非Microsoft框架)被编码为这种抽象 所以他们不需要任何特定的Web主机(例如IIS)。