Jak naprawić logowanie i rejestracje po podłączeniu aplikacji do istniejącej bazy w asp.net core mvc 2.1?

0

Mam problem z rejestracją i logowaniem po połączeniu aplikacji napisanej w asp.net core mvc do istniejącej bazy danych, która została wygenerowana z poziomu aplikacji asp.net mvc. W aplikacji Asp.Net core mvc wygenerowałem sobie modele na podstawie istniejącej bazy za pomocą komendy: Scaffold-DbContext i otrzymałem zmapowane klasy takie jak: AspNetUsers, AspNetRoles itd. Próbowałem następnie w potoku middlewarów dodać uwierzytelnianie:

services.AddDefaultIdentity<AspNetUsers>().AddEntityFrameworkStores<ApplicationDbContext>();

Za każdym razem otrzymuje błąd:

System.InvalidOperationException: 'AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey>.'

Wygenerowana klasa kontekstu

  public partial class ApplicationDbContext : DbContext

Próbowałem tu zmienić na IdentityDbContext, ale wtedy w ogóle nie łączy się z bazą.

_LoginPatrial (tutaj dodałem AspNetUsers w typ generyczny)

@inject SignInManager<AspNetUsers> SignInManager
@inject UserManager<AspNetUsers> UserManager

Początkowo aplikacja asp.net core mvc miała swoją własną bazę i uwierzytelnianie.

Jak mogę to naprawić?

1

Nie pamiętam jak to wyglądało w ASP.NET MVC ale sprawdziłem w swój kawałek kodu od .NET CORE

Tam mój AppDbContext dziedziczy z IdentityDbContext a ten z kolei IdentityDbContext<IdentityUser, IdentityRole, string>

Podziedzicz może w swoim ApplicationDbContext po IdentityDbContext<IdentityUser, IdentityRole, string> i podaj do tego generyka swoje klasy użytkownika z poprzedniego projektu.
W .NET Core kluczem jest string dla IdentityUser jeśli u Ciebie jest coś innego to zamiast string podaj to co masz (int czy long)

0

W pewnym stopniu udało mi się to naprawić. W metodzie OnModelCreating wywołałem

base.OnModelCreating(modelBuilder);

i udało się wtedy dziedziczyć w kontekscie po IdentityDbContext

Dzięki temu jestem w stanie się zarejestrować i zalogować. Pojawił się za to inny problem, bo w momencie jak stworze konto z poziomu jednej aplikacji i będę chciał się zalogować na to konto z poziomu drugiej aplikacji, które korzystają z tej samej bazy, to niestety nie uda się zalogować...

Jest to spowodowane tym, że musiałem odpalić skrypt na bazie, który lekko mi zmodyfikował tabele aspnetusers po to by móc korzystac z identity cora.
https://stackoverflow.com/questions/38315812/use-a-identity-2-0-database-to-authenticate-a-asp-net-core-1-0-application?rq=1

Nie wiem, czy da się jeszcze zrobić tak, by ta rejestracja i logowanie działały tak samo dla obu aplikacji?

0

Pomyśl o czymś jak SSO. (single sign on). Na szybko znalazłem propozycje oparte o ciastko... takie trochę mało zgrabne na dziś. Można też oparte o JWT - może jako osobne Web API.
Z drugiej strony jak chcesz łączyć bez dodatkowego klocka to temat tego wygląda dość obiecująco (nie testowałem) Sharing Authorization Cookies between ASP.NET 4.x and ASP.NET Core 1.0

0

Wydaje mi się, że będziesz musiał sam napisać autoryzację. U mnie w firmie nie mamy niestety EF ale w zwyklym sql jest jedna baza z userami i loginami i mozna sie pomiedzy aplikacjami logowac bo wspolnie trzymaja tam userow ;) . Co do ciastek to jest to w jakis sposob rozwiazane bo w metadanych ma informacje czy user bije do api z 1 czy 2 aplikacji. Ale niestety nie jestem w stanie podać ci rozwiązania

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