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

rys*_*sov 1 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
}
Run Code Online (Sandbox Code Playgroud)

为每个动作编写控制部分非常不方便,所以我正在寻找避免它的方法.如果它是Nemerle我可以使用属性级宏,但对于C#,我认为,最好的方法是PostSharp.提供此功能的其他方法有哪些建议?

Che*_*hev 5

ASP.NET MVC中有多种授权选项.你的方式确实非常不方便,但还有更好的方法!你在C#中有属性宏:)

[Authorize]
public ActionResult DoSomething(int someParam)
{
     //Do stuff here.
     Return View();
}
Run Code Online (Sandbox Code Playgroud)

[授权]标签可以直接上方的控制器上的任何行动或甚至高于所述控制器类本身仅使身份验证的用户可访问整个控制器被放置.

[Authorize]
public class HomeController : Controller
{
     //Actions and stuff
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是成员资格和角色提供程序,则甚至可以在属性中包含角色过滤器.

[Authorize(Roles="trader")]
public ActionResult SomeAction(int someParam)
{
     //stuff...
}
Run Code Online (Sandbox Code Playgroud)

也可以对整个URL路由应用授权.与在传统ASP.NET Web窗体中应用目录级别授权的方式类似.只需在web.config中添加这样的内容:

<location path="Admin">
     <system.web>
          <authorization>
               <deny users="?"/>
               <allow roles="SiteAdmin"/>
               <deny users="*"/>
          </authorization>
     </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

这告诉UrlAuthorizationModule(默认情况下为所有ASP.NET应用程序注册),对于URL~/Admin和匹配〜/ Admin/*的URL,它应该执行以下操作:

•拒绝未经身份验证的访问者访问()

•允许访问SiteAdmin角色中经过身份验证的访问者()

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