Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 若我使用Authorize,那个么它将转到登录循环,而不会重定向到另一个页面_C#_Asp.net Mvc - Fatal编程技术网

C# 若我使用Authorize,那个么它将转到登录循环,而不会重定向到另一个页面

C# 若我使用Authorize,那个么它将转到登录循环,而不会重定向到另一个页面,c#,asp.net-mvc,C#,Asp.net Mvc,现在在Homecontroller中,我的代码如下 [HttpGet] public ActionResult Login() { return View(); } [HttpPost] [ValidateAntiForgeryToken] [AllowAnonymous] public ActionResult Login(User u) { if (ModelState.IsValid)

现在在Homecontroller中,我的代码如下

   [HttpGet]
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    [AllowAnonymous]
    public ActionResult Login(User u)
    {
        if (ModelState.IsValid)
        {
            objlogin = new LoginClass();
            DataTable dt = objlogin.Authentication(u.Username , u.Password);
            if (dt.Rows.Count > 0)
            {
                Session["UserId"] = dt.Rows[0]["UserId"];
                return RedirectToAction("Index" , "Home");
            }
            else
            {
                u.Error = "Invalid Cridential";
                return View(u);
            }
        }
        return View(u);
    }
我创建的BaseController就像

[Authorize]
public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }
}
但成功登录后,它不会重定向到Homecontroller,而是会再次重定向到登录操作

请帮助我。

嗯,[Authorize]属性检查身份验证管道。您的登录代码从不进行身份验证,它只设置将在OnActionExecuting上检查的会话值,该值位于比身份验证管道更低的级别:

如您所见,首先在[Authorize]工作的地方运行身份验证和授权过滤器,然后调用OnActionExecuting代码


您必须将用户登录到应用程序,或使用自定义操作筛选器并放弃[授权]完全属性。@ /P>>P>如Camilo Terevinto所指出的,您的BaseCeTunLL..OnAccession执行不被调用,因为授权之前用默认的授权逻辑调用,它不考虑会话对象的自定义逻辑。

如果要实现自己的自定义授权逻辑,可以执行以下操作:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Session["UserId"] != null)
            base.OnActionExecuting(filterContext);
        else
            RedirectToAction("Login", "Login");
    }
}
HomeController无需从自定义类派生:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    //Called when access is denied
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(new { controller = "Login", action = "Login" })
        );
    }
    //Core authentication, called before each action
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var userId = httpContext.Session["UserId"];
        return userId != null;
    }
}

您的LoginController可能保持不变

objlogin.Authentication的实现是什么。。。?这是一个负载平衡的环境吗?它只是检查用户是否存在并返回用户数据。其他任何东西,如Session[UserId]总是空的。Session[UserId]不是空的。那么您能告诉我应该在BaseController中编写什么代码来授权用户吗?@Sagarpadhiyar,这取决于您的需要。您可以使用FormsAuthentication.SetAuthCookie或OWIN管道,通常使用ASP.NET标识。我理解,但在执行任何操作之前,我希望在控制器级别检查会话[UserId]是否为空,然后将其重定向到登录页面。你能给我一点点吗suggestion@Sagarpadhiyar如果您需要这种行为,最好完全删除[Authorize]属性。请把你从哪里得到的链接贴出来。它与登录和退出网站没有任何关系。
[MyAuthorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}