C# 若我使用Authorize,那个么它将转到登录循环,而不会重定向到另一个页面
现在在Homecontroller中,我的代码如下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)
[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();
}
}