MVC5身份验证过滤器

时间:2013-11-08 12:34:01

标签: asp.net-mvc-5

新身份验证与以前的授权过滤器有什么区别?我没有看到任何区别。我总是使用:[Authorize(Roles = "Admin, User")]

您希望何时使用身份验证过滤器?什么时候使用授权?

有人可以解释一下这个区别吗?样品会很棒。感谢

3 个答案:

答案 0 :(得分:4)

您可以找到文章here

我还创建了一个类似的帖子here

虽然我得到的答案很清楚一些事情,但我仍然对如何使用它有点困惑,但更多的是预期的行为(如果你看到我的帖子你会看到)。

简而言之,新的Authentication过滤器会在旧Authorization过滤器之前触发。

此外,根据我的理解,身份验证将是检查用户是否在您的网站上进行身份验证的好地方。换句话说,那个用户在某个时候给了我他的凭据让我查看它们与数据库。如果答案是肯定的,那么很好......继续。

如果答案为否,则用户未经过身份验证,而我应该返回http状态代码 401 Unauthorized


至于Authorization,我的理解是,用户是隐式认证的,他可能是Authorized来访问某个页面或资源。如果是这种情况,那么我应该返回一个http状态代码 403 Forbidden 。这就是[Authorize]属性发挥作用的地方。


虽然这是我理解的,但这两个过滤器的行为并不像我认为它们会起作用。也许这是由于我缺乏理解造成的......

例如:新的Authentication过滤器似乎无法识别(或考虑)[AllowAnonymous]属性。我看待它的方式应该是。

另一方面,旧[Authorize]属性确实识别(并考虑)[AllowAnonymous]属性。

最后,我不确定这是否会帮助你或者让你更加困惑,但我仍然在与他们玩耍以完全掌握它。

答案 1 :(得分:3)

授权和身份验证之间的基本区别在于,授权是检查您“被授权”执行某些操作或访问某些内容的过程。身份验证正在检查您是谁,或者检查您确实是您所说的那个(即您是'真实的')。

授权通常通过查看您的用户角色(与您的身份相关联)以及其中任何一个是否满足所访问的功能来完成。通常通过检查您的密码是否与您的用户名存储的密码(理想情况下是加密形式)相匹配来完成身份验证。例如。你的凭据是正确的。这当然取决于您的密码是秘密的假设,所以只有您知道密码。

然而,扩展身份验证方案也是可能的,例如Facebook服务器说您确实是具有给定用户名的人(当您之前使用它们登录时)。称为单点登录(SSO)的机制。可以通过(可能是自定义的)身份验证过滤器实现这些不同的方案。

到目前为止,我只给出了一些定义。但总结一下;原则上,身份验证不会查看您的用户角色,而授权只会查看您的用户角色。另请注意,授权只能在身份验证完成后进行。这就是认证过滤器优先于授权过滤器的原因。它还表明您可以在同一方法上使用这两个属性,因此通常不能在身份验证或授权之间进行选择,但您可以同时使用这两个属性!

没有指定任何[Authorized]属性的普通Roles=属性可能最令人困惑,因为这只会检查您是否已登录,例如 经过身份验证。这可以看作是身份验证。但身份验证实际上已经发生过。现在只根据MVC5添加了身份验证过滤器,因为在身份验证几乎总是通过一种技术完成之前:您获得的ASP.NET身份验证cookie(成员身份)登录。现在oAuth和其他SSO登录方法已成为主流新的身份验证过滤器提供钩子以更容易地实现替代方案。比如:'设置认证cookie如果Facebook说它没问题':)。

答案 2 :(得分:1)

在MVC 5之前,身份验证是通过授权属性完成的。现在这些在MVC 5中分开。认证过滤器在授权过滤器之前执行。可以通过从身份验证和操作过滤器派生新过滤器来编写自定义身份验证过滤器然后,如果需要,可以更改请求中的用户主体。例如为了执行特定的行动,可能需要其他委托人,那时它非常有帮助。