我使用以下代码来控制ASP.MVC应用程序(这是一个控制器)的访问权限:
public ActionResult MakeEditable(int id)
{
// controlling part
if (!User.Identity.IsAuthenticated)
{
return RedirectToAction("Login", "User", new {
callback = Url.Action("MakeEditable", "Article", new { id = id })
});
}
// action's body
}
为每个动作编写控制部分非常不方便,所以我正在寻找避免它的方法。如果它是Nemerle我可以使用属性级宏,但对于C#,我认为,最好的方法是PostSharp。提供此功能的其他方法有哪些建议?
答案 0 :(得分:5)
ASP.NET MVC中有多种授权选项。你的方式确实非常不方便,但还有更好的方法!你在C#中有属性宏:)
[Authorize]
public ActionResult DoSomething(int someParam)
{
//Do stuff here.
Return View();
}
[授权] 标记可以直接放在控制器上的任何操作上方,甚至可以放在控制器类本身上方,以使整个控制器只能由经过身份验证的用户访问。
[Authorize]
public class HomeController : Controller
{
//Actions and stuff
}
如果您使用的是成员资格和角色提供程序,则甚至可以在属性中包含角色过滤器。
[Authorize(Roles="trader")]
public ActionResult SomeAction(int someParam)
{
//stuff...
}
也可以对整个URL路由应用授权。与在传统ASP.NET Web窗体中应用目录级别授权的方式类似。只需将这样的内容添加到web.config:
<location path="Admin">
<system.web>
<authorization>
<deny users="?"/>
<allow roles="SiteAdmin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
这告诉UrlAuthorizationModule(默认情况下为所有ASP.NET应用程序注册),对于URL~ / Admin和匹配〜/ Admin / *的URL,它应该执行以下操作:
•拒绝未经身份验证的访问者访问()
•允许以SiteAdmin角色()
访问经过身份验证的访问者•拒绝访问所有其他访问者()