ASP.MVC应用程序中的访问控制

时间:2010-11-06 17:32:50

标签: asp.net-mvc

我使用以下代码来控制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。提供此功能的其他方法有哪些建议?

1 个答案:

答案 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角色()

访问经过身份验证的访问者

•拒绝访问所有其他访问者()