W moim kodzie nie działa mi poprawnie atrybut [Authorize] i nie wiem co jest źle.
Projekt jest robiony zgodnie z kursem na Yt:
I obecnie zaciąłem się na odcinku nr 9. W poradniku jest stosowany ef 3.1, a ja używam 5.0, może to też ma wpływ.
Problem polega dokładnie na tym, że kiedy w kontrolerze zajmującym się admin panelem wstawiam atrybut authorize, to logowanie się działa poprawnie, jednak nie jest możliwe dostanie się do admin panelu, ponieważ nie wiem czemu działa automatycznie ciasteczko, które przekierowuje z powrotem do logowania (po poprawnym zalogowaniu). Przez co nie jest możliwe dostanie się do panelu admina. Natomiast kiedy nie używam atrybutu [Authorize] to nie mogę zabezpieczyć admin panelu przed ingerencją.
Poniżej zawartość plików kodu (Nazwy takie same jak na kursie z YT) Robione niemal kropka w kropkę
AuthController.cs
using Blog.ViewModels;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace Blog.Controllers
{
public class AuthController : Controller
{
private SignInManager<identityuser> _signInMgr;
public AuthController(SignInManager<IdentityUser> signInManager)
{
_signInMgr = signInManager;
}
[HttpGet]
public IActionResult Login()
{
return View(new LoginViewModel());
}
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel vm)
{
var result = await _signInMgr.PasswordSignInAsync(vm.UserName, vm.Password, false, false);
if (!result.Succeeded)
{
return View(vm);
}
else
{
return RedirectToAction("Index", "Panel");
}
//return RedirectToAction("Index", "Home");
}
[HttpGet]
public async Task<IActionResult> Logout()
{
await _signInMgr.SignOutAsync();
return RedirectToAction("Index", "Home");
}
}
}
Startup.cs
using Blog.Data;
using Blog.Data.Repository;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Blog
{
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
})
//.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>();
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Auth/Login";
});
services.AddTransient<IRepository, Repository>();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}",
defaults: "Home/Index");
endpoints.MapRazorPages();
});
}
}
}
Ewentualnie jeszcze Program.cs
using Blog.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Linq;
namespace Blog
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
try
{
var scope = host.Services.CreateScope();
var ctx = scope.ServiceProvider.GetRequiredService<appdbcontext>();
var userMgr = scope.ServiceProvider.GetRequiredService<UserManager<identityuser>>();
var roleMgr = scope.ServiceProvider.GetRequiredService<RoleManager<identityrole>>();
ctx.Database.EnsureCreated();
var adminRole = new IdentityRole("Admin");
if (!ctx.Roles.Any())
{
roleMgr.CreateAsync(adminRole).GetAwaiter().GetResult();
}
if (!ctx.Users.Any(u => u.UserName == "admin"))
{
var adminUser = new IdentityUser
{
UserName = "admin",
Email = "[email protected]"
};
var result = userMgr.CreateAsync(adminUser, "password").GetAwaiter().GetResult();
userMgr.AddToRoleAsync(adminUser, adminRole.Name).GetAwaiter().GetResult();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
```