全局注册时自定义身份验证属性多次执行并最终抛出异常

时间:2016-10-05 09:37:41

标签: c# asp.net-mvc authentication asp.net-mvc-5

我正在尝试使用自定义身份验证和表单身份验证来实现身份验证。

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }            
        // get result from database based on the username and password match
        switch (result)
        {
            case SignInStatus.Success:
                // set cookie 
                return RedirectToAction("Index", "Home");                
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

accountController如上所示。然后我实现了一个自定义身份验证属性,如下所示。

public class CustomAuthentication : FilterAttribute, IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext context)
    {
        if (context.HttpContext.User.Identity.IsAuthenticated)
        {
            // hit database and check the credentials 
        }
        else
        {
            context.Result = new HttpUnauthorizedResult(); // mark unauthorized
        }
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext context)
    {
        if (context.Result == null || context.Result is HttpUnauthorizedResult)
        {
            // redirect to login page
        }
    }
}

当我在filterconfig.cs

中全局注册此属性时
filters.Add(new CustomAuthentication());

控件直接进入OnAuthentication方法,因为用户未经过身份验证,OnAuthenticationChallenge被执行,然后控件再次回到OnAuth方法。这种情况一直持续,并且它会抛出一个异常,说“请求过滤模块被配置为拒绝查询字符串太长的请求。”

当我通过在家庭控制器上使用自定义属性做同样的事情时,我得到了预期的结果,因为OnAuth方法仅在登录方法之后被调用一次。

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

这是我的身份验证的Web配置。 这可能是我这种行为的原因?我是否以正确的方式进行身份验证? 提前致谢

0 个答案:

没有答案