我的任务是为我们的MVC 4.0项目的方法创建一个自定义成员提供程序。
根据属性([Authorize]
?),必须发现是否允许尝试的用户使用该方法。
目前我已经拥有了这个:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class TestAuthorize : CodeAccessSecurityAttribute
{
public TestAuthorize(SecurityAction action)
: base(action)
{
}
public override IPermission CreatePermission()
{
throw new NotImplementedException();
}
}
当我添加
return new PrincipalPermission(null,null,true)
我希望权限有效,用户可以访问该方法。
当我添加
return new PrincipalPermission(null.null,false)
我希望权限无效,并且将拒绝用户访问该方法。
但是,只有当我使用throw new SecurityException("You are denied access")
时它才会停止,这也会强制MVC应用程序停止,除非在客户端处理此异常(使用try catch)。
我们可以在MVC项目中处理这个异常吗?
作为我们希望通过使用属性所做的事情的一个例子:
[TestAuthorize(SecurityAction.Demand)]
public List<string> GetList()
{
//if access, return new List();
//if no access, return null;
}
答案 0 :(得分:1)
很确定你想在这里继承AuthorizeAttribute
,而不是CodeAccessSecurityAttribute
。在您的属性中,您覆盖AuthorizeCore
,如果允许用户继续,则返回true
,如果他们没有被授权执行该方法的操作,则只返回false
。 false
结果将触发HTTP-401 Unauthorised
响应,ASP.NET会自动将用户重定向到登录页面,以便他们可以作为具有正确访问权限的人员登录,但您可以更改此行为你希望。
实际上,您甚至可能不需要创建自己的属性;如果您正在使用现有的ASP.NET MVC mempership提供程序,或者您可以使用它来使用它,那么现有的AuthorizeAttribute
将适合您。