NET 6 WebAPI - link z ustawieniem hasła dla klienta B2B

0

Witam.
W jaki sposób ogarnąć w NET 6 rejestrację użytkownika B2B? Tylko administrator systemu powinien tworzyć nowych użytkowników. Po utworzeniu, klient powinien dostać mail, na którym będzie mógł ustawić hasło do swojego panelu/konta. Zauważyłem, że inne systemy mają w linku parametr z jakimś tokenem/ciągiem znaków ale jak takie coś zwalidować po stronie API i frontu?

PS.
Front w Angularze.

5

Być może źle interpretuję pytanie, ale chyba jest ono niezależne od konkretnej technologii? Bardziej pasuje do działu Inżynieria Oprogramowania.

Sam jakiś czas temu musiałem coś takiego zaimplementować. Przy tworzeniu nowego użytkownika tworzę również obiekt UserVerificationToken który przechowuje między innymi takie właściwości:

public string Token { get; }
public string TemporaryPassword { get; }
public int VerificationAttempts { get; private set; }

Gdzie Token to właśnie unikalny token identyfikujący weryfikację danego użytkownika. Kiedy użytkownik dostaje maila to jest w nim link z tokenem. Po kliknięciu w link otwiera się strona w SPA (Blazor w tym przypadku) gdzie użytkownik musi podać tymczasowe hasło, jak i wpisać nowe (i potwierdzić). Wysyłam request do specjalnego endpointu w API który weryfikuje podane dane, ustawia użytkownikowi hasło i gotowe. Tymczasowe hasło jest oczywiście przechowywane jako hash w bazie danych.

Co ważne, to przy regularnym logowaniu, konto użytkownika jest sprawdzane właśnie pod kątem pozytywnej weryfikacji. Użytkownik który próbuje się zalogować a nie ma zweryfikowanego konta jest odrzucany. To czy użytkownik jest zweryfikowany w moim przypadku sprawdzam bardzo łatwo- nowo utworzeni użytkownicy po prostu nie mają hasła. Jeśli nie ma hasła, to znaczy że nie przeszedł weryfikacji i nie może się zalogować.

0

Takie to proste widzę. Myślałem, że ktoś rzuci jakimś libem z nugeta, a tu wystarczy klasa. Wrzuciłem ten wątek do C#, ponieważ API akurat mam w tym napisane i wydawało mi się, że Microsoft ma swoje rozwiązania, które mógłbym wykorzystać. Dodatkowo, biorąc pod uwagę, że NET 6 to "najlepszy NET Framework na świecie", wyszedłem z założenia, że C# wygeneruje za mnie taki link i wszystko zadziała magicznie samo :D

0

Może takie coś Ci podsunie rozwiązanie Identity Server ma jakieś metody do generowania tokena -> https://docs.microsoft.com/en-us/aspnet/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity

Ogólnie koncepcja jest taka:

  1. Tworzysz konto w którym jest bool accountConfirmed.
  2. Tworzysz unikalny token GUID/UUID etc.
  3. Wysyłasz maila z tym tokenem parametrem do kliknięcie.
  4. Jeżeli token się zgadza z URL'em to znaczy że użytkownik był realny i stworzył to konto.
1
AdamWox napisał(a):

wyszedłem z założenia, że C# wygeneruje za mnie taki link i wszystko zadziała magicznie samo :D

Ale taki link to jest zwykły string. Trzymasz podstawowy url w jakimś configu. Doklejasz wygenerowany Guid i wysyłasz mailem. Pomyśl o:
czy te tokeny trzymać w osobnej tabeli (ja bym tak trzymał, bo potem dojdzie zmiana hasła czy coś innego a to już inny typ tokenu)
możliwośc jednokrotnego użycia
ważność tokenu
jeśli wygasł a konto nieaktywne wygenerowanie nowego podając email
ogólnie wygenerowanie nowego bo np mail ktos skasowal

musisz przy tym rozwiązaniu rozpatrzyć wszystkie przypadki

0

@szydlak: A powinno się weryfikować adres email podczas takiego potwierdzania konta? Co jeśli ktoś dostanie link z aktywacją nie swojego konta?

0

No ale jak nie swojego? Jak podajesz tylko maila i jeśli taki jest to wysyłasz link jak nie ma to informacja: Jeśli konto istnieje link aktywacyjny został wysłany

0

@szydlak dobrze prawi (dałbym mu łapkę w górę ale on mi nie dał więc elo :D). Wszystkie przypadki które wymienił są jak najbardziej ważne, i przykład który podałem oczywiście nie miał sugerować że takich rzeczy nie trzeba brać pod uwagę. W mojej aplikacji takie tokeny są właśnie trzymane oddzielnie w bazie, mają termin wygaśnięcia i są usuwane po wygaśnięciu lub uwierzytelnieniu.

0

No domyślny mechanizm Identity w .Net generuje, przechowuje i porównuje tokeny. Tak jak ktoś napisał, wystarczy dokleić to do Twojego adresu i taki link wysyłasz w mailu.

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