Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC中的Authorize属性_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC中的Authorize属性

Asp.net mvc 3 ASP.NET MVC中的Authorize属性,asp.net-mvc-3,Asp.net Mvc 3,我很难理解ASP.NET MVC中[Authorize]属性的实际用法。按照这个概念,如果我们用[Authorize]属性修饰控制器方法,那么只有经过身份验证的用户才能访问控制器 我开发了一个ASP.NET MVC应用程序,没有使用[Authorize]属性装饰控制器。我观察到的是,如果我使用web.config或其他方式在应用程序中正确实现身份验证机制,那么我现在就无法访问特定操作方法的URL{controller}/{action}/{id} 系统总是要求登录。这意味着我的控制器是安全的。我

我很难理解ASP.NET MVC中
[Authorize]
属性的实际用法。按照这个概念,如果我们用
[Authorize]
属性修饰控制器方法,那么只有经过身份验证的用户才能访问控制器

我开发了一个ASP.NET MVC应用程序,没有使用
[Authorize]
属性装饰控制器。我观察到的是,如果我使用web.config或其他方式在应用程序中正确实现身份验证机制,那么我现在就无法访问特定操作方法的URL
{controller}/{action}/{id}


系统总是要求登录。这意味着我的控制器是安全的。我的问题是,当我可以在不使用
[Authorize]
属性的情况下保护我的控制器时,它的真正需求是什么?

真正的力量来自于理解和实现成员资格提供者以及角色提供者。您可以将用户分配到角色中,并且根据该限制,您可以为不同的用户到控制器操作或控制器本身应用不同的访问角色

 [Authorize(Users = "Betty, Johnny")]
 public ActionResult SpecificUserOnly()
 {
     return View();
 }
或者您可以根据组进行限制

[Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
    return View();
}

它的存在是因为它使用起来更方便,而且使用属性来标记授权参数而不是xml配置是一种完全不同的思想。这并不是为了打败通用配置或任何其他授权框架,只是MVC的方式。我这么说是因为你似乎在寻找一种技术特性的优势,而这种优势可能不是。。。非常方便


博布罗克已经列出了优势。为了补充他的答案,另一个场景是,您可以将此属性应用于整个控制器,而不仅仅是操作,还可以将不同的角色授权参数添加到同一控制器中的不同操作以进行混合和匹配

使用
Authorize
属性似乎更方便,感觉更像“MVC方式”。至于技术优势,有一些

我想到的一个场景是,当你在应用程序中使用输出缓存时。Authorize属性处理得很好


另一个是可扩展性。
Authorize
属性只是基本的现成过滤器,但您可以覆盖其方法并执行一些预授权操作,如日志记录等。我不确定如何通过配置来实现这一点。

一个优点是您正在将access编译到应用程序中,因此,修改Web.config时不会意外更改它

这可能不是你的优势,也可能是劣势。但对于某些类型的访问,它可能更可取


另外,我发现Web.config中的授权信息污染了它,使查找内容变得更加困难。因此,在某些方面它是首选的,而在其他方面则没有其他方法可以做到这一点。

使用
[Authorize]
属性可以帮助防止应用程序中出现安全漏洞。MVC处理URL的方式(即将它们路由到控制器而不是实际的文件)使得很难通过web.config文件真正保护所有内容


请阅读此处的更多信息:

web.config中的标记基于路径,而MVC使用控制器操作和路由

如果您只是想阻止未登录的用户,那么这是一个架构决策,可能不会有太大的区别,但当您尝试在角色中应用基于授权的权限时,以及在您希望自定义未授权类型处理的情况下,这一决策会有很大的区别

博布罗克的回答涵盖了第一个案例

用户应至少具有以下角色之一才能访问控制器或操作

[Authorize(Roles = "Admin, Super User")]
为了能够访问控制器或操作,用户应该同时拥有这两个角色

[Authorize(Roles = "Super User")]
[Authorize(Roles = "Admin")]
可以访问控制器或操作的用户是Betty和Johnny

[Authorize(Users = "Betty, Johnny")]
在ASP.NET Core中,您可以通过
[Authorize]
使用和原则进行授权

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

[Authorize(Policy = "ElevatedRights")]
第二种方法在更大的应用程序中非常方便,在这些应用程序中,可能需要根据具体情况使用不同的限制、流程和处理来实现授权。因此,我们可以使用authorized属性并为我们的项目实现不同的授权方案

public class CustomAuthorizeAttribute: AuthorizeAttribute  
{  
    public override void OnAuthorization(AuthorizationContext filterContext)  
    {  }
}

ASP.NET MVC中执行授权的“正确完成的”方法是使用
[Authorize]
属性。

谢谢您的回答。但是同样的限制,我可以使用我的web.config,对控制器返回的查看页面使用成员资格和角色提供程序。我不需要为此使用[authorize]属性。@kaus-需要指出的一点是,在MVC应用程序中使用web.config可能会出现安全漏洞。authorize属性考虑了所有ASP.NET路由,而使用web.config,您必须了解应用程序中所有可能的路由配置,并将其考虑在内。您可能已经考虑到了这一切,但是您无法通过查看web.config和routing.config以及其他任何地方来确定。通过查看类上的Authorize属性,您知道它是安全的,无论路由如何。+1表示可扩展性。与web.config方法相比,这无疑是一个优势