Atrybut [Authorize] mi nie działa

0

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>();
            });
}
}

screenshot-20211018203711.png```

3

Robisz Redirect() na ("Index","Home") lub na ("Index","Panel"), a w dalszym ciągu przeglądarka pokazuje ci localhost:44308/Auth. Jesteś pewny, że przekierowujesz? Jesteś pewny, że masz kontroler Panel oraz kontroler Home?

2

Po 1. Pokaż kod LoginView.
Po 2. Nie migrowałem jeszcze do .Net5, ale pewnie jest podobnie. Nigdzie w konfiguracji nie widzę AddAuthentication. To może być Twój problem. Nie rejestrujesz serwisów związanych z autentykacją. I w ogóle na jakiej podstawie to działa? BearerToken? - Nie widzę konfiguracji. Cookies? Nie widze konfiguracji (jest tylko konfiguracja ciasteczka aplikacji, ale nie autoryzacji)
Po 3. Chyba powinieneś zamienić miejscami UseAuthentication i UseAuthorization, ale tego nie jestem pewien. Pamiętaj, że w Configure konfigurujesz pipeline całej aplikacji, a więc kolejność tutaj ma znaczenie.

0

@AdamWox: screenshot-20211019183955.png
Tak, jestem pewien, że mam oba kontrolery.
A przekierowanie, to zależy co masz na myśli. W AuthController (Kod w poście) jest zapisane przekierowanie.
Inne przekierowanie które się tam uruchamia to ciasteczko (ze skonfigurowaną ścieżką logowania), nie powinno się uruchomić, a to robi. Kiedy usuwam atrybut [Authorize] z kodu przekierowania działają poprawnie, tylko wtedy admin panel nie jest chroniony.

0

@Juhas:
1)

@model LoginViewModel

@{

}

<form class="sign-in-form" asp-controller="Auth" asp-action="Login" method="post">
    <div>
        <label>Username</label>
        <input asp-for="UserName" />
    </div>
    <div>
        <label>Password</label>
        <input asp-for="Password" />
    </div>
    <div>
        <input type="submit" value="Sign In" />
    </div>
</form>
  1. Na jakiej zasadzie możesz w pełni zobaczyć z kursu do którego podałem link. Robię go kropka w kropkę. Większość załatwiona jest domyślnie. Konfiguruje tylko ścieżkę do logowania, jeżeli chodzi o ciasteczka, i tą całą konfiguracje w Program.cs

Ale w tym momencie gdy to piszę, zauważyłem, że może mam źle, więc najpierw to sprawdzę i odpiszę potem.

0

@Juhas: Rzeczywiście. To ten błąd, wielkie dzięki. W kursie używają tylko jednej z tych funkcji, a ja zamieściłem obie, z myślą żeby od raz w kodzie widzieć różnice. Nie przyszło mi do głowy, że zwykła kolejność podobnych metod, może mieć znaczenie. Spędziłem nad tym samemu w sumie z 20h. A tu proszę od ręki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1