我正在尝试使用自定义身份验证和表单身份验证来实现身份验证。
[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配置。 这可能是我这种行为的原因?我是否以正确的方式进行身份验证? 提前致谢