Файл Program.cs с аутентификацией Cookie:
builder.Services.AddAuthentication("CookieAuthentication").AddCookie("CookieAuthentication", options =>
{
options.LoginPath = "/<Login/LoginView";
options.AccessDeniedPath = "/Login/AccessDenied";
});
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Login}/{action=Signup}/{id?}");
app.Run();
Контроллер входа:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult LoginView(string username, string password)
{
if (!ModelState.IsValid)
{
//Error code here
}
if (!UserExists(username, password))//Check if user exists in Database
{
//Error code here
}
TempData["Username"] = username;
return RedirectToAction("Index", "Home");
//I used breakpoint here and this code runs but doesn't work properly.
}
Я также использовал атрибут [Authorize] на Home Controller, чтобы пользователи не могли получить к нему доступ без входа в систему. Login/LoginView — это путь входа в систему.





Эта страница не работает Localhost перенаправляется слишком много раз MVC
Для вашего текущего сценария обязательно добавьте [AllowAnonymous] к вашему Index действию в HomeController. А ваш LoginPath — это /Home/Index, авторизация не требуется.
[Authorize]
public class HomeController : Controller
{
[AllowAnonymous]
public async Task<IActionResult> Index()
{
//do your stuff...
return View();
}
//....
}
Обновлять:
Аутентификация cookie для входа
Программа.cs:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
{
options.LoginPath = "/Login/LoginView";
options.AccessDeniedPath = "/Login/AccessDenied";
});
var app = builder. Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication(); //be sure add authentication and authorization middleware.....
app.UseAuthorization();
//...
Как вздохнуть в пользователь:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> LoginView(string username, string password)
{
if (!ModelState.IsValid)
{
//Error code here
}
if (!UserExists(username, password))//Check if user exists in Database
{
//Error code here
}
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier,username) //add the claims you want...
};
//authProperties you can choose any option you want, below is a sample...
var authProperties = new AuthenticationProperties
{
//IssuedUtc = DateTimeOffset.UtcNow,
//ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1),
//IsPersistent = false
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
TempData["Username"] = username;
return RedirectToAction("Index", "Home");
}
Я знаю, что это решает одну проблему, но, тем не менее, пользователь не может получить доступ к другим авторизованным контроллерам и методам действий. Потому что он не авторизован. Также, если я установлю LoginPath как /Home/Index, целевая страница станет домашней, а не страницей входа. Кроме того, маршрут по умолчанию /Home/Index упоминается в промежуточном программном обеспечении.
Привет @BabarHussain, если эта первоначальная проблема была решена, предложите принять ответ, который позволит другим быстро найти решение. Для новой проблемы, пожалуйста, опубликуйте новую тему, чтобы объяснить, как пользователь входит в систему, и поделитесь подробным кодом, потому что невозможность доступа к авторизованному действию вызвана неавторизованным или неавторизованным пользователем. Спасибо.
Я бы, конечно, принял ответ, но он точно не дает решения. [AllowAnonymous] в действии Index в HomeController не является хорошим подходом, поскольку пользователь не прошел проверку. Пользователь должен пройти проверку для доступа к любым другим контроллерам или методам действий.
Я думаю, вы не понимаете ошибки. Ваш путь входа невозможен для авторизации. Потому что если метод объявлен с авторизацией, его необходимо авторизовать, и проект будет перенаправлять на путь входа в систему. Для вашего пути входа в систему используется Home/Index, поэтому он всегда будет перенаправлять пользователя на путь входа.
Моя ошибка, я использовал неправильный путь входа в файл program.cs, теперь исправлена. Домашний контроллер — это путь, который отображается после успешного входа в систему из Login/LoginView.
Поэтому вам нужно поделиться, как вы хотите войти в систему, с помощью аутентификации cookie или идентификации, ваш код всегда перенаправляет на действие Index, конечно, он всегда будет давать вам слишком много перенаправлений, поэтому я даю вам добавить атрибут [AllowAnonymous] для ваша текущая проблема. В любом случае, я обновляю ответ и рассказываю, как работает аутентификация файлов cookie, которую вы можете проверить.
Вы сказали, что добавляете атрибут
[Authorize]в HomeController? Обязательно добавьте[AllowAnonymous]к действию Index в HomeController. Потому что для вашего URL кажется, что он всегда перенаправляет наHome/Index.