Problem z działaniem atrybutu [Authorize] w asp .net core mvc EF 5.0 oraz odwieczny problem samouków czyli kurs na starszej wersji oprogramowania (EF 3.1)

0

Tak więc witam.
Może powiem tak jak już napisałem w tytule jestem samoukiem i jak się pewnie domyślacie (z tytułu) mam problem tego faktu, że robię projekt bloga z kursu jak zrobić bloga na TY:
Wszystko byłoby fajnie, ale tak jak w zasadzie od początku mojego samouctwa w programowaniu. Ucząc się z kursów, niektóre elementy języka w nowszej wersji nie działają tak samo jak choćby 3 lata temu. Tak jest i tutaj... A przynajmniej tak myślę... (Sprawdzałem kod z 5 razy i zgadzał się z tym z kursu).
Opis Problemu:
W odcinku dziewiątym tego kursu robimy admin panel. Wszystko byłoby ok, gdyby nie to, że jedna rzecz nie działa. Po uzupełnieniu pól formularza logowania i kliknięciu Sign In (zaloguj) strona nie przekierowuje do strony Index za pomocą kontrolera PanelController który ma atrybut [Authorize] (Dostanie się do admin panelu), tylko z powrotem do formularza logowania (za pomocą ciasteczek) z ustawionym LoginPath na url formularza logowania. Oprócz tego wszystko działa. Przekierowywanie ciasteczek. Poprawna weryfikacja logowania. Zapamiętywanie czy jest użytkownik zalogowany czy nie...Tylko to jedno nie działa.
Pomożecie?

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");        // To może być nie tak

            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-20211003185233.png

0

Moim zdaniem masz dwie kwestie, które musisz sprawdzić:

  1. Czy na pewno zapisujesz w ciastkach informacje o zalogowanym użytkowniku przed przekierowanie na Index/Panel?
  2. Czy .GetAwaiter().GetResult(); taki zabieg nie powinien być asynchronicznie z użyciem await? W kursie gość robi asynchroniczne metody.

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