3

我有一个基于 ASP.NET MVC 的应用程序,它允许根据用户进行不同级别的访问。它当前的工作方式是当用户访问页面时,对数据库进行检查以确定用户拥有的权限。然后根据用户拥有的访问级别选择视图。一些用户比其他用户看到更多的数据并且拥有更多可用的功能。每个页面还进行各种ajax调用来显示和更新页面上显示的数据。

我的问题是确保特定 ajax 调用源自视图并且不是手动制作以返回或更新用户无权访问的数据的最佳方法是什么?我宁愿不必每次进行 ajax 调用时都去数据库重新检查,因为在用户最初加载页面时已经完成了。

4

4 回答 4

2

查看Authorize Attribute,您可以将其放在整个控制器上或仅放在控制器中的特定方法上。

例子:

[Authorize(Roles = "Administrator")]
public class AdminController : Controller
{
 //your code here
}

或者

public class AdminController : Controller
{
    //Available to everyone
    public ActionResult Index()
    {
        return View();
    }

    //Just available to users in the Administrator role.
    [Authorize(Roles = "Administrator")]
    public ActionResult AdminOnlyIndex()
    {
        return View();
    }
}

或者,您可以编写自定义 Authorize 属性来提供您自己的逻辑。

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{           
    protected override bool AuthorizeCore(HttpContextBase httpContext)     
    {
        IPrincipal user = httpContext.User;     
        var validRoles = Roles.Split(',');//Roles will be a parameter when you use the Attribute        
        List<String> userRoles = GetRolesFromDb(user);//This will be a call to your database to get the roles the user is in.

        return validRoles.Intersect(userRoles).Any();
    }
} 

要使用:

 [CustomAuthorizeAttribute(Roles = "Admin,Superuser")] 
 public class AdminController : Controller {

 }
于 2012-08-22T22:53:23.833 回答
0

这取决于您使用的会话机制类型。您是否使用默认会员服务提供商?如果不是,您可以传递用户的 id 和 sessionid 确保用户会话有效并且用户具有进行该调用所需的权限。

于 2012-08-22T22:11:49.567 回答
0

除了 Authorize 属性,您还可以只允许使用自定义属性的 Ajax 请求,如此处所示

谢谢

于 2012-08-23T00:11:47.270 回答
0

如果我使用的是帖子使用

[Authorize]
[ValidateAntiForgeryToken]

如果你正在使用 get 使用

[Authorize]

您也可以使用此自定义属性

public class HttpAjaxRequestAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        if (!controllerContext.HttpContext.Request.IsAjaxRequest())
        {
            throw new Exception("This action " + methodInfo.Name + " can only be called via an Ajax request");
        }
        return true;
    }
}

然后如下装饰你的动作

[Authorize]
[HttpAjaxRequest]
public ActionResult FillCity(int State)
{
    //code here
}

如果这能解决您的问题,请记住“标记/打勾”。

于 2017-08-25T06:45:01.863 回答