I want to make two different SignOut panel(for Writers and Admins) in Asp.Net Core MVC with N-Tier Architecture. I tried many things to do this but I couldn’t.SignIn and SignOut process works correctly for Admins but for Writers SignIn works correctly, SignOut does not work.It directs me to Admin Login page. I do not know what should I do. I defined Writer and Admin schemes and called them with Authenticate attribute.Also, I am sure about that I assgin correct action and controller in .cshtml page.
//Program.cs
using BusinessLayer.Abstract;
using BusinessLayer.Concrete;
using DataAccessLayer.Abstract;
using DataAccessLayer.Concrete;
using DataAccessLayer.Concrete.Repositories;
using DataAccessLayer.EntityFramework;
using EntityLayer.Concrete;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.EntityFrameworkCore;
using MVC_Proje_Kamp.Controllers;
using System.Security.Claims;
namespace MVC_Proje_Kamp
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var connectionString = configuration.GetConnectionString("mssqlconnection");
builder.Services.AddControllersWithViews();
builder.Services.AddSession();
builder.Services.AddScoped<AdminManager>();
builder.Services.AddScoped<IAdminDal, EfAdminDal>();
builder.Services.AddScoped<WriterManager>();
builder.Services.AddScoped<IWriterService, WriterManager>();
builder.Services.AddScoped<IWriterDal, EfWriterDal>();
builder.Services.AddScoped<IContentService, ContentManager>();
builder.Services.AddScoped<IContentDal, EfContentDal>();
builder.Services.AddHttpContextAccessor();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = "AdminScheme";
})
.AddCookie("AdminScheme", options =>
{
options.LoginPath = "/Login/Index";
options.AccessDeniedPath = "/Login/Index";
options.Cookie.Name = "AdminScheme";
})
.AddCookie("WriterScheme", options =>
{
options.LoginPath = "/WriterPanelLogin/WriterLogin";
options.AccessDeniedPath = "/WriterPanelLogin/WriterLogin";
options.Cookie.Name = "WriterScheme";
options.LogoutPath= "/WriterPanelLogin/WriterLogOut";
});
// Authorization Check
builder.Services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStatusCodePagesWithReExecute("/ErrorPage/Page404");
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "Default",
pattern: "{controller=Category}/{action=Index}/{id?}");
app.Run();
}
}
}
//LoginController(For Admin)
public class LoginController : Controller
{
AdminManager adminManager = new AdminManager(new EfAdminDal());
[AllowAnonymous]
[HttpGet]
public IActionResult Index()
{
return View();
}
//LogIn
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Index(Admin p)
{
var context = adminManager.LogIn(p);
if (context != null)
{
await HttpContext.SignInAsync("AdminScheme", context);
return RedirectToAction("Index", "AdminCategory");
}
else
{
return RedirectToAction("Index");
}
}
//Logout
public async Task<IActionResult> LogOut()
{
await HttpContext.SignOutAsync("AdminScheme");
return RedirectToAction("Index", "Login");
}
}
//WriterPanelLoginController
public class WriterPanelLoginController : Controller
{
private readonly WriterManager _writerManager;
public WriterPanelLoginController(WriterManager writerManager)
{
_writerManager = writerManager;
}
[AllowAnonymous]
[HttpGet]
public IActionResult WriterLogin()
{
return View();
}
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> WriterLogin(Writer p)
{
var login = _writerManager.LogIn(p);
if (login != null)
{
await HttpContext.SignInAsync("WriterScheme", login);
return RedirectToAction("MyHeadings", "WriterPanel");
}
return RedirectToAction("WriterLogin");
}
//Logout
public async Task<IActionResult> WriterLogOut()
{
await HttpContext.SignOutAsync("WriterScheme");
return RedirectToAction("WriterLogin", "WriterPanelLogin");
}
}
//WriterPanelController
public class WriterPanelController : Controller
{
HeadingManager headingManager = new HeadingManager(new EfHeadingDal());
CategoryManager categoryManager = new CategoryManager(new EfCategoryDal());
WriterManager writerManager = new WriterManager(new EfWriterDal());
public IActionResult WriterProfile()
{
return View();
}
[Authorize(AuthenticationSchemes = "WriterScheme")]
public IActionResult MyHeadings()
{
var values = headingManager.GetListByWriter();
return View(values);
}
[HttpGet]
public IActionResult NewHeading()
{
List<SelectListItem> category = (from i in categoryManager.GetCategoryList()
select new SelectListItem
{
Text = i.CategoryName,
Value = i.CategoryId.ToString()
}).ToList();
ViewBag.categories = category;
return View();
}
[HttpPost]
public IActionResult NewHeading(Heading p)
{
p.HeadingDate = DateTime.Parse(DateTime.Now.ToShortDateString());
p.WriterId = 3;
p.HeadingStatus = true;
headingManager.HeadingAdd(p);
return RedirectToAction("MyHeadings", "WriterPanel");
}
[HttpGet]
public IActionResult Update(int id)
{
List<SelectListItem> category = (from i in categoryManager.GetCategoryList()
select new SelectListItem
{
Text = i.CategoryName,
Value = i.CategoryId.ToString()
}).ToList();
ViewBag.categories = category;
var update = headingManager.GetById(id);
return View(update);
}
[HttpPost]
public IActionResult Update(Heading p)
{
p.WriterId = 3;
headingManager.HeadingUpdate(p);
return RedirectToAction("MyHeadings");
}
public IActionResult Delete(int id)
{
var delete = headingManager.GetById(id);
delete.HeadingStatus = false;
headingManager.HeadingDelete(delete);
return RedirectToAction("MyHeadings");
}
}
//AdminCategoryController
public class AdminCategoryController : Controller
{
CategoryManager categoryManager = new CategoryManager(new EfCategoryDal());
[Authorize(AuthenticationSchemes = "AdminScheme",Roles = "B")]
public IActionResult Index()
{
var categoryValues = categoryManager.GetCategoryList();
return View(categoryValues);
}
[HttpGet]
public IActionResult AddCategory()
{
return View();
}
[HttpPost]
public IActionResult AddCategory(Category p)
{
CategoryValidator categoryValidator = new CategoryValidator();
ValidationResult result = categoryValidator.Validate(p);
if (result.IsValid)
{
categoryManager.CategoryAdd(p);
return RedirectToAction("Index");
}
else
{
foreach (var error in result.Errors)
{
ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
}
}
return View(p);
}
public IActionResult Delete(int id)
{
var delete = categoryManager.GetById(id);
categoryManager.CategoryDelete(delete);
return RedirectToAction("Index");
}
[HttpGet]
public IActionResult Update(int id)
{
var update = categoryManager.GetById(id);
return View(update);
}
[HttpPost]
public IActionResult Update(Category p)
{
categoryManager.CategoryUpdate(p);
return RedirectToAction("Index");
}
}
I get help from many AI and web but I could not solve this problem.