我有一个用AuthorizeAttribute修饰的控制器.除了一个需要CustomAuthorizeAttribute提供的自定义身份验证的操作外,控制器还包含几个需要身份验证的操作.
我的问题是,一旦我在控制器级别添加[授权],我可以使用[CustomAuthorize]仅在一个操作上覆盖它(或删除它)吗?或者我是否必须从控制器级别删除[授权]并将其单独添加到其他每个操作?
我纯粹是为了方便,因为我很懒,不想用AuthorizeAttribute来装饰每一个动作.
[Authorize]
public class MyController : Controller {
//requires authentication
public ViewResult Admin() {
return View();
}
//... a lot more actions requiring authentication
//requires custom authentication
[CustomAuthorize] //never invoked as already failed at controller level
public ViewResult Home() {
return View();
}
}
Run Code Online (Sandbox Code Playgroud) 哪个授权属性?
System.Web.Http.Authorize
System.Web.Mvc.Authorize
using System.Web.Mvc // or
using System.Web.Http
Run Code Online (Sandbox Code Playgroud)
典型的控制器
[Authorize]
public class SomeController : Controller
Run Code Online (Sandbox Code Playgroud)
我们有控制器注释[Authorize]
我注意到由于使用命名空间,注释在技术上引用了不同的属性类.
该项目包含MVC控制器和WEBAPI控制器.
我应该使用哪一个?为什么?如果我不解决这个问题,我们可能会遇到什么问题?
我在ASP.NET MVC Web应用程序中启用了表单身份验证.我想允许匿名用户只访问某些特定页面,例如Register.cshtml.通过这样做,我能够允许从我的根web.config访问我的CSS文件.
<location path="Content/Site.css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)
现在我想允许匿名访问其他页面,如Home和Register.有人知道如何实现这个目标吗?
是否有一种方法可以在具有Authorize属性的控制器类中的一个操作中忽略[Authorize]属性?
[Authorize]
public class MyController : Controller
{
[Authorize(Users="?")]//I tried to do that and with "*", but unsuccessfuly,
public ActionResult PublicMethod()
{
//some code
}
public ActionResult PrivateMethod()
{
//some code
}
}
Run Code Online (Sandbox Code Playgroud)
只需要PrivateMethod()就可以进行身份验证,但也需要它.
PS:我不想制作我的自定义授权过滤器.
[]的
我有一个非常简单的场景.我想用自定义授权属性装饰我的控制器/操作.如果任何属性有效,则应授予授权.例如,
[MyAuth(1)]
[MyAuth(2)]
public class MyController : Controller
{
...
}
Run Code Online (Sandbox Code Playgroud)
我无法将参数组合到单个授权属性中.以上示例仅是一个简化示例.
如果任一属性授权用户,我希望用户获得授权.我认为ActionFilterAttribute或者AuthorizeAttribute有办法看看其他过滤器已被执行并等待执行,但没有这样的运气.
我怎么能做到这一点?由于属性似乎没有任何意识,也许是HttpModule?一个习惯ControllerActionInvoker?
我已经实现了自己的自定义Authorize属性.
该属性既适用于控制器级别,也适用于操作级别.
这是我需要做的一个例子:
[ClaimsAuthorize(Roles = "AdvancedUsers")]
public class SecurityController : Controller
{
[ClaimsAuthorize(Roles = "Administrators")]
public ActionResult AdministrativeTask()
{
return View();
}
public ActionResult SomeOtherAction()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
目前,如果用户具有管理员角色但不具有AdvancedUsers角色,则他无法执行"管理任务".
即使用户未在控制器级别授权,如何更改此行为以在操作级别执行安全检查?
目前,我能想到的唯一解决方案是实现2个属性:一个用于保护控制器,另一个用于保护操作.然后我将使用Order属性首先在动作级别执行一个.
但是,如果可能的话,我更喜欢具有单个属性的解决方案.
我的控制器在类级别使用一个属性,它只允许一个角色访问。这个控制器有 20 多个动作。但是对于仅一项操作,我还需要一个角色才能获得访问权限。我已经在类级别声明了属性过滤器,以便它对控制器类中的所有操作都能正常工作。但现在我只想在同一个控制器中覆盖一个动作。有没有可能?我正在使用 .Net 4.5 版。
过滤器属性实现是这样的:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class RequireModulePermissionAttribute : AuthorizeAttribute
{
//code goes here
}
Run Code Online (Sandbox Code Playgroud)
控制器类:
[RequireModulePermission("Admin")]
public class AdministrationController : Controller
{
[HttpPost]
[RequireModulePermission("Admin","Supervisor")]
public ActionResult CreateUser(UserViewModel userVM)
{
//code goes here
}
}
Run Code Online (Sandbox Code Playgroud) 我已经创建了一个自定义授权属性,但我需要一些操作来允许匿名访问。我尝试了三种不同的方法,但没有成功:使用AllowAnonymous、使用附加参数更新现有属性,以及创建新的覆盖属性。基本上,控制器级属性似乎总是在操作级属性之前被调用。
这是控制器:
[AuthorizePublic(Sites = AuthSites.Corporate)]
public class CorporateController : SecuredController
{
[AuthorizePublic(Sites = AuthSites.Corporate, AllowAnonymous = true)]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
以及属性:
public class AuthorizePublic : AuthorizeAttribute
{
public AuthSites Sites { get; set; }
public bool AllowAnonymous { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// Logic
}
}
Run Code Online (Sandbox Code Playgroud)
作为最后的手段,我可以将登录操作移动到它们自己的控制器上,但在这样做之前,我是否缺少一些东西来使这些方法之一发挥作用?我有点惊讶的是操作级属性并没有覆盖控制器级属性。