asp.net 核心出现错误 "ERR_TOO_MANY_REDIRECTS"
Getting error "ERR_TOO_MANY_REDIRECTS" in asp.net core
我正在尝试创建自定义登录注销,其中登录用户无法访问主视图。登录后用户可以重定向到主页视图。如果用户试图访问主视图,那么他必须被重定向到登录页面。
这是我的代码...
登录部分查看
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@using Microsoft.AspNetCore.Http;
@{
var userId = Context.Session.GetString("username");
if (userId == null)
{
Context.Response.Redirect("/Login");
}
else
{
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link text-light mt-2">Hello @Context.Session.GetString("username")!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
<button type="submit" class="nav-link btn btn-link text-white-50">Logout</button>
</form>
</li>
</ul>
}
}
这是我的登录控制器
public class LoginController : Controller
{
private readonly ApplicationDbContext _db;
public LoginController(ApplicationDbContext context)
{
_db = context;
}
public IActionResult Index()
{
return View("Login");
}
[HttpPost]
public IActionResult LoginProcess(string username, string password)
{
var userId = _db.logins.Where(p=>p.UserName==username && p.Password==password && p.ExpiryDate> DateTime.Now).Select(p=>p.Id).FirstOrDefault();
if (userId>0)
{
HttpContext.Session.SetString("username", username);
return Redirect("~/Reception/Home");
}
else
{
ViewBag.error = "Invalid Login..!";
return View("Login");
}
}
[HttpGet]
public IActionResult Logout()
{
HttpContext.Session.Remove("username");
return RedirectToAction("Index");
}
}
}
用户在未登录的情况下无法打开主页视图。
我建议..创建一个基本控制器。另一个控制器应该继承自 base controller.You 可以检查用户是否在 base 控制器中登录,如果您发现用户未登录,则可以将用户重定向到登录页面。
不推荐在登录视图检查用户登录的方式。
public class BaseController : Controller
{
// Check here user credentials or whether user is logged-in or not
}
public class LoginController : BaseController
{
public IActionResult home()
{
return View("home");
}
}
所以每当任何用户想要访问任何页面时,您的应用程序将始终以这种方式检查用户身份验证。
如果没有 运行 代码,它在第一遍看起来就像您将用户设置为无限循环。您的视图检查用户名并在失败时重定向到“/login”端点,随后 returns 视图再次检查,依此类推。最终,浏览器会踩刹车。
从您介绍的内容来看,您似乎在尝试推出自己的登录机制,而不是利用 ASP NET Core 可以提供的功能来帮助自动处理其中的一些问题。看看Simple authorization in ASP.NET Core
我正在尝试创建自定义登录注销,其中登录用户无法访问主视图。登录后用户可以重定向到主页视图。如果用户试图访问主视图,那么他必须被重定向到登录页面。
这是我的代码...
登录部分查看
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@using Microsoft.AspNetCore.Http;
@{
var userId = Context.Session.GetString("username");
if (userId == null)
{
Context.Response.Redirect("/Login");
}
else
{
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link text-light mt-2">Hello @Context.Session.GetString("username")!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
<button type="submit" class="nav-link btn btn-link text-white-50">Logout</button>
</form>
</li>
</ul>
}
}
这是我的登录控制器
public class LoginController : Controller
{
private readonly ApplicationDbContext _db;
public LoginController(ApplicationDbContext context)
{
_db = context;
}
public IActionResult Index()
{
return View("Login");
}
[HttpPost]
public IActionResult LoginProcess(string username, string password)
{
var userId = _db.logins.Where(p=>p.UserName==username && p.Password==password && p.ExpiryDate> DateTime.Now).Select(p=>p.Id).FirstOrDefault();
if (userId>0)
{
HttpContext.Session.SetString("username", username);
return Redirect("~/Reception/Home");
}
else
{
ViewBag.error = "Invalid Login..!";
return View("Login");
}
}
[HttpGet]
public IActionResult Logout()
{
HttpContext.Session.Remove("username");
return RedirectToAction("Index");
}
}
}
用户在未登录的情况下无法打开主页视图。
我建议..创建一个基本控制器。另一个控制器应该继承自 base controller.You 可以检查用户是否在 base 控制器中登录,如果您发现用户未登录,则可以将用户重定向到登录页面。 不推荐在登录视图检查用户登录的方式。
public class BaseController : Controller
{
// Check here user credentials or whether user is logged-in or not
}
public class LoginController : BaseController
{
public IActionResult home()
{
return View("home");
}
}
所以每当任何用户想要访问任何页面时,您的应用程序将始终以这种方式检查用户身份验证。
如果没有 运行 代码,它在第一遍看起来就像您将用户设置为无限循环。您的视图检查用户名并在失败时重定向到“/login”端点,随后 returns 视图再次检查,依此类推。最终,浏览器会踩刹车。
从您介绍的内容来看,您似乎在尝试推出自己的登录机制,而不是利用 ASP NET Core 可以提供的功能来帮助自动处理其中的一些问题。看看Simple authorization in ASP.NET Core