AuthorizeAttribute只调用一次

时间:2016-04-29 08:52:40

标签: c# visual-studio-2012 asp.net-mvc-5

嘿,伙计们,

我已经制作了自己的自定义athorizeattribute。它只触发一次(直接在具有此属性的第一个actionresult之后)。但是,当我尝试采取相同的行动时,它会起作用(这会导致安全漏洞)。

控制器:

    public class IsLoggedInAsHero : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (!isAuthenticatedAsHero())
            {
                filterContext.Result = new RedirectToRouteResult(
                                            new RouteValueDictionary(new { controller = "Account", action = "Login" })
                                    );
            }
        }
    }

AuthenticationController:

public static bool isAuthenticatedAsHero()
{
    User user = new User();
    user = udc.GetUserByCookie();
    if (user.Hero== 1 && System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
    { return true; }
    else return false;
}

isAuthenticatedAsHero():

var firstname = $("#FirstName").val().replace(/å/gi, "a").replace(/ä/gi,"a").replace(/ö/gi, "o").replace(/[^a-z0-9\s]/gi, '');

var lastname = $("#LastName").val().replace(/å/gi, "a").replace(/ä/gi, "a").replace(/ö/gi, "o").replace(/[^a-z0-9\s]/gi, '');

$("#Mail").val(firstname + "." + lastname + '@customer.Email');

非常感谢帮助!

3 个答案:

答案 0 :(得分:1)

我不确定这是否是您的解决方案,但据我认为,您应该覆盖此方法:

protected override bool AuthorizeCore(HttpContextBase httpContext){
    return isAuthenticatedAsHero();
}

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
      filterContext.Result = new RedirectToRouteResult(
                                 new RouteValueDictionary(new { controller = "Account", action = "Login" })
                             );
}

答案 1 :(得分:1)

最好让基类处理未经授权的请求,如果用户未经授权,它将返回401状态代码。然后ASP.Net框架检查您的网站是否启用了表单身份验证,然后它将自动重定向到登录页面。

因此,您的IsLoggedInAsHero类应该如下所示

public class IsLoggedInAsHero : AuthorizeAttribute
    {
       protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
       {
            if (!isAuthenticatedAsHero())
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
       }
    }

您需要在web.config文件中启用表单身份验证。

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" />
 </authentication>

答案 2 :(得分:0)

在我的大多数系统中,我都有一个用户通常被称为“仪表板”的分区。这是我的授权示例:

 public class DashBoardAuthorizeAttribute : AuthorizeAttribute 
    {
        /// <summary>
        /// Handles the unauthorized request.
        /// </summary>
        /// <param name="context">The context.</param>
        protected override void HandleUnauthorizedRequest(AuthorizationContext context)
        {
            var newName = "UserContext" + HttpContext.Current.User.Identity.Name;
            var cache = MemoryCache.Default;
            var userContext = cache.Get(newName) as IUserModel;
            if (userContext != null && !userContext.DashBoardAccess)
            {
                var urlHelper = new UrlHelper(context.RequestContext);
                var address = urlHelper.Action("Index", "Home");
                context.Result = new RedirectResult(address ?? "login");
            }
            else
            {
                base.HandleUnauthorizedRequest(context);
            }
        }
    }

在我的控制器上或在个人行动中:

[DashBoardAuthorizeAttribute]
public async Task<ActionResult> GetUsers(){
 return View();
}

这将在每次执行任何操作之前执行。您应该在将来的项目中重新评估您的命名约定。如果我是另一个受雇于此项目的开发人员,我不知道“IsLoggedInAsHero”是什么或应该做什么,除非我打开代码并查看它。命名惯例应该基本上传达它为了便于开发而应该做些什么。使用“DashBoardAuthorizeAttribute”,另一个开发人员可以假设它是一个与“仪表板”相关的授权属性。