C# 对用户隐藏部分视图,但使其可用于AJAX

C# 对用户隐藏部分视图,但使其可用于AJAX,c#,jquery,angularjs,ajax,asp.net-mvc,C#,Jquery,Angularjs,Ajax,Asp.net Mvc,所以基本上我有一个带有Angular的单页应用程序,它与ASP.NETMVC一起工作。我有一个控制器,只有部分视图,我希望用户不能访问它们 通常情况下,我会使用[ChildActionOnly],但我不是从视图中调用我的MVC部分,而是从AJAX中调用(我在应用程序的不同部分使用jQuery和angular) 有没有一种方法可以阻止用户访问我的部分内容,而让ajax在用户单击链接时获取它们 谢谢,您尝试过数据批注吗?当然,您可以将“Admin”更改为任何组或用户,或者只使用它而不使用任何用户或角

所以基本上我有一个带有Angular的单页应用程序,它与ASP.NETMVC一起工作。我有一个控制器,只有部分视图,我希望用户不能访问它们

通常情况下,我会使用
[ChildActionOnly]
,但我不是从视图中调用我的MVC部分,而是从AJAX中调用(我在应用程序的不同部分使用jQuery和angular)

有没有一种方法可以阻止用户访问我的部分内容,而让ajax在用户单击链接时获取它们


谢谢,

您尝试过数据批注吗?当然,您可以将“Admin”更改为任何组或用户,或者只使用它而不使用任何用户或角色:

[Authorize(Roles = "Admin")]
将其添加到类的正上方或要限制的每个操作的正上方


当然,您可以只在类声明上方执行[Authorization],以确保必须登录,然后在每个操作上执行更具体的操作,方法是声明谁有权使用这些操作

尽管使用
AuthorizationAttribute来处理这一问题听起来很简单,但您可以想象这样做

public class AjaxOnlyAuthorization : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            base.OnAuthorization(filterContext);
        }
        else
        {
            //..No Go
        }
    }
}
然后

[AjaxOnlyAuthorization]
public MyAjaxOnlyClass
{
}
可能更适合使用
ActionFilterAttribute
,因为响应格式与授权关系不大

public class AjaxOnlyFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ...    
    }
}

但我的应用程序的问题是,我没有使用Identity提供的所有功能。我实现了自己的身份验证来使用Authorize属性,这意味着我没有配置角色。我可以配置一个“开发人员”角色并以这种方式使用它。考虑到我使用身份验证的方式,我相信这可能是我目前首选的方法。如果我的应用程序在其完整性中使用Identity,则首选角色。谢谢见我的评论。ActionFilterAttribute可能更合适。尝试了几次之后,它似乎从未达到基本要求。OnActionExecuting(filterContext);调用,而不考虑使用调用该操作的URL或角度绑定导航。有没有关于IsAjaxRequest在下面做什么的线索?补充我之前的评论。IsAjaxRequest似乎要求'X-Requested-With'='XMLHttpRequest'为true。添加$httpProvider.defaults.headers.common['X-Requested-With']='XMLHttpRequest';他成功了。