ASP.NET Core Identity este un sistem de apartenenta care adauga functionalitatea de conectare si de utilizator la aplicatiile ASP.NET Core. Include multe caracteristici care nu sunt disponibile si are asistenta de baza pentru stocarea unui numar de telefon pentru un utilizator. Puteti imbunatati robustetea validarii numarului de telefon ASP.NET Core si puteti oferi o experienta de utilizator mai buna prin integrarea functiilor de telefonie ale lui Twilio in aplicatia dvs.

In mod implicit, numarul de telefon din ASP.NET Core Identity este validat cu o expresie obisnuita, dar este prea de baza pentru a confirma daca numarul este intr-adevar valid, daca include codul de apelare a tarii sau daca poate primi mesaje SMS. Ati putea implementa o validare imbunatatita folosind biblioteca libphonenumber-csharp, asa cum este descris intr-o postare anterioara a blogului Twilio. In mod alternativ, puteti utiliza diferite API-uri Twilio pentru a valida complet numarul de telefon, detaliile de cautare despre acest numar (cum ar fi transportatorul sau tipul) si pentru a demonstra proprietatea telefonului cu un mesaj de verificare text sau vocal.

Mai multe etape de validare sunt necesare pentru a determina daca un numar de telefon poate fi asociat cu un utilizator de aplicatie pentru un anumit scop, dar voi analiza doar primul pas in aceasta postare: asigurarea unui numar este valid pentru o anumita tara si determinarea daca este posibil sa poata primi mesaje text. API-ul Twilio’s Lookup poate oferi aceasta functionalitate intr-o aplicatie Razor Pages care foloseste ASP.NET Core Identity pentru managementul utilizatorului.

Cerinte preliminare

Pentru a urmari impreuna cu aceasta postare, veti avea nevoie

  • Un cont Twilio (inscrieti-va pentru un cont Twilio gratuit aici)
  • .NET Core 2.2 SDK (versiunea 2.2.102 sau mai mare)
  • Cod VS, Visual Studio 2017 sau alt editor
  • O familiaritate cu paginile Razor (vezi postarea mea anterioara pentru o introducere in paginile Razor)

Puteti gasi codul complet pentru aceasta postare pe GitHub.

Validarea datelor in paginile Razor de baza ASP.NET

Razor Pages este un aspect nou al ASP.NET Core MVC care a fost introdus in ASP.NET Core 2.0. Este foarte similar cu modelul traditional Model-View-controller (MVC) utilizat frecvent in ASP.NET Core, dar foloseste o abordare „bazata pe pagina”. Vedeti postarea mea anterioara pentru o introducere in paginile Razor si cum difera acestea de ASP.NET Core MVC.

Razor Pages foloseste aceleasi procese de validare a modelului si de validare a modelului ca MVC, dar le aplica unui „Model de pagina” in loc de parametrii metodei de actiune. De exemplu, [Obligatoriu] si [EmailAddress] sunt atribute de validare care verifica valoarea proprietatii InputModel.Email este corecta.

public partial class IndexModel: PageModel {[BindProperty] public InputModel Input {get; a stabilit; } public class InputModel {[Obligatoriu] [EmailAddress] public string Email {get; a stabilit; }}}

Aceste atribute se gasesc in spatiul de nume System.ComponentModel.DataAnnotations, care include un atribut [Phone] pentru validarea numerelor de telefon. Din pacate, acest atribut este simplist si nu tine cont de setul extrem de complex de reguli si exceptii care se aplica numerelor de telefon.

Pentru o mai buna validare, puteti utiliza biblioteca open source creata de Google si pe care o foloseste pentru validarea numerelor de telefon: libphonenumber. Exista un port C # al bibliotecii, libphonenumber-csharp, pe care il puteti instala in aplicatia dvs. utilizand pachetul NuGet. Aceasta postare de pe blogul Twilio arata cum sa o folosesti in aplicatiile tale.

Alternativ, puteti utiliza API-ul Twilio Lookup pentru a valida numerele de telefon. Aceasta foloseste aceeasi biblioteca de validare a libphonenumber-ului in spatele scenei, dar poate oferi, de asemenea, detalii suplimentare, cum ar fi informatiile operatorului (in SUA), tipul numarului de telefon (fix / mobil / VOIP) sau detalii despre frauda suspectata asociate cu numar.

In aceasta postare va voi arata cum puteti utiliza API-ul Twilio Lookup intr-o noua aplicatie Razor Pages pentru a valida numarul de telefon optional furnizat de utilizatori. Vom valida faptul ca numarul pe care l-a introdus utilizatorul este valabil pentru tara selectata, ca poate primi mesaje SMS si, daca da, vom salva numarul in formatul standard E.164.

Personalizarea paginilor Razor de identitate de baza ASP.NET

In versiunile mai vechi de ASP.NET Core, crearea unei noi aplicatii MVC sau Razor Pages utilizand sabloanele ASP.NET Core Identity ar arunca mii de linii de cod in aplicatia dvs. Acest lucru s-a schimbat in ASP.NET Core 2.1 odata cu introducerea Bibliotecilor de clasa Razor.

Bibliotecile Razor Class va permit sa incorporati vizualizarile, paginile Razor si vizualizarea componentelor intr-un pachet NuGet. Pentru a include elementele UI intr-o aplicatie, trebuie doar sa faceti referire la pachetul NuGet. Toate paginile Razor din biblioteca vor fi apoi disponibile in aplicatia dvs. fara a fi nevoie de lucrari suplimentare de partea dvs.

Acesta este modul in care ASP.NET Core Identity se livreaza acum. Cand creati o noua aplicatie Core ASP.NET cu Identitate, directorul proiectului dvs. va fi practic gol in loc sa aiba mii de fisiere. In general, este un lucru bun – nu trebuie sa gestionati codul infrastructurii sau sa il tineti la curent.

Dezavantajul evident este ca daca doriti sa personalizati experienta implicita, de exemplu pentru a imbunatati validarea telefonului ca noi, nu puteti incepe doar sa actualizati codul. Din fericire, Razor Class Libraries va permite sa treceti peste oricare dintre vizualizarile incluse sau pe Razor Pages, plasand o pagina pe aceeasi cale din aplicatie.

ASP.NET Core ofera instrumente pentru schela acestor fisiere „inlocuire” pentru ASP.NET Core Identity. Schela de identitate este incorporata in Visual Studio 2017 sau exista un instrument global multipla platforma dotnet-aspnet-codegenerator pe care il puteti rula de pe linia de comanda. Va arat cum sa folositi instrumentul global pentru a esafona pagina / Identitate / Cont / Gestionare pe care trebuie sa o personalizam.

Crearea proiectului de studiu de caz

Folosind Visual Studio 2017+ sau .NET CLI, creati o noua solutie si proiectati cu urmatoarele caracteristici:

  • Tip: Aplicatie web ASP.NET Core 2.2 (nu MVC) cu Visual C #
  • Nume: ValidatePhoneNumberDemo
  • Director de solutii
  • Depozitul Git
  • https
  • Autentificare: conturi de utilizator individuale, stocati conturi de utilizator in aplicatie

ASP.NET Core Identity foloseste Entity Framework Core pentru a stoca utilizatorii in baza de date, deci asigurati-va ca executati migratiile bazei de date dupa construirea aplicatiei:

actualizare a bazei de date dotnet ef

Utilizarea .NET CLI pentru a imprima pagini de identitate

Instalati instrumentul global aspnet-codegenerator. Retineti ca exista o eroare in cea mai recenta versiune a instrumentului in momentul scrierii (2.2.0), astfel ca urmatoarea instaleaza ultima versiune buna cunoscuta (2.1.6).

instrumentul dotnet instalare -g dotnet-aspnet-codegenerator – versiunea 2.1.6

NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design este necesar de instrumentul global aspnet-codegenerator, asadar, instalati-l in proiectul dvs. folosind NuGet Package Manager, Package Manager Console CLI sau editand fisierul ValidatePhoneNumberDemo.csproj . Asigurati-va ca setati atributul PrivateAssets la All, astfel incat pachetul sa fie utilizat doar in timpul dezvoltarii.

<PackageReference Include = “Microsoft.VisualStudio.Web.CodeGeneration.Design” Version = “2.2.1” PrivateAssets = “Toate” />

Deschideti o fereastra de consola in folderul proiectului aplicatiei (nu in folderul solutiei ). Rulati instrumentul de schele pentru a genera pagina Razor Account.Manage.Index. Pe langa listarea fisierelor de generat, trebuie sa specificati numele complet al contextului EF Core DB pentru proiectul dvs.

identitate aspnet-codegenerator dotnet – fisiere Account.Manage.Index -dc ValidatePhoneNumberDemo.Data.ApplicationDbContext

Schela ar trebui sa se completeze in cateva secunde, iar dupa aceea veti vedea noi fisiere in proiectul dvs. Schela genereaza fisierul solicitat, la care se adauga fisierele de vizualizare si partial.

Puteti vizualiza o lista cu toate paginile posibile pentru a genera folosind identitatea dotnet aspnet-codegenerator –listFiles.

Dupa ce aplicatia ruleaza, explorati validarea numarului de telefon existent pentru utilizatorii din ASP.NET Core Identity

  • Inregistrati un utilizator nou facand clic pe Inregistrare din bara de meniu
  • Introduceti un e-mail si o parola
  • Faceti clic pe Hello <email>! din bara de meniu pentru a vedea profilul / gestiona pagina de cont sau navigati la / Cont / Gestionare
  • Incercati sa salvati diverse numere de telefon pentru a vedea ce este valid. Sugestie: 0 este aparent un numar de telefon valid!

Initializarea API-ului Twilio

Vom folosi biblioteca de ajutor Twilio pentru a simplifica apelarea API-ului Twilio HTTP. Instalati pachetul Twilio NuGet (versiunea 5.22.0 sau o versiune ulterioara) folosind NuGet Package Manager, Package Manager Console CLI sau editand fisierul ValidatePhoneNumberDemo.csproj . Dupa utilizarea oricareia dintre aceste metode, sectiunea <ItemGroup> a fisierului de proiect ar trebui sa arate astfel (numerele de versiune pot fi mai mari):

<ItemGroup> <PackageReference Include = “Microsoft.AspNetCore.App” /> <PackageReference Include = “Microsoft.AspNetCore.Razor.Design” Version = “2.2.0” PrivateAssets = “Toate” /> <PackageReference Include = “Microsoft. VisualStudio.Web.CodeGeneration.Design “Version =” 2.2.1 “PrivateAssets =” Toate “/> <PackageReference Include =” Twilio “Version =” 5.22.0 “/> </ItemGroup>

Pentru a apela API-ul Twilio, veti avea nevoie de contul dvs. Twilio Sid si Auten Token (gasite in Panoul de bord Twilio). Atunci cand se dezvolta local, acestea ar trebui sa fie stocate folosind Secrets Manager, astfel incat sa nu se angajeze accidental in depozitul de cod sursa. Puteti citi despre cum si de ce sa faceti asta in acest post pe Twilio Blog. Secrets.json-ul dvs. rezultat ar trebui sa arate asa:

“TwilioAccountDetails”: {“AccountSID”: “ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”, “AuthToken”: “your_auth_token”}

Bibliotecile de asistenta Twilio folosesc o instanta singleton a clientului Twilio, ceea ce inseamna ca nu trebuie decat sa o configurati o singura data in aplicatie. Cel mai bun loc pentru a configura astfel de lucruri se afla in fisierul Startup.cs . Adaugati folosind Twilio; in partea de sus a Startup.cs si adaugati urmatoarele la sfarsitul ConfigureServices:

public void ConfigureServices (IServiceCollection services) {var accountSid = Configurare [“TwilioAccountDetails: AccountSID”]; var authToken = Configurare [“TwilioAccountDetails: AuthToken”]; TwilioClient.Init (accountSid, authToken); }

Aceasta configureaza clientul Twilio static folosind datele de acreditare cu ajutorul sistemului de configurare ASP.NET Core. Daca trebuie sa personalizati solicitarile facute catre Twilio (de exemplu, folosind un server proxy) sau doriti sa folositi functiile HttpClientFactory introduse in ASP.NET Core 2.1, consultati postarea mea anterioara pe blogul Twilio pentru o abordare alternativa.

Un adevar incomod: numerele de telefon sunt grele

Dupa cum va sti orice dezvoltator care a avut (dis-) placerea de a lucra cu zone orare; zonele orare sunt dificile. Din pacate, si numerele de telefon sunt grele! Exista un numar mare de conceptii gresite pe care dezvoltatorii trebuie sa le rezolve atunci cand incep cu adevarat sa lucreze cu numere de telefon. Acest document din biblioteca libphonenumber de pe programatorii falsi cred ca despre numerele de telefon este o introducere excelenta.

O astfel de problema este aceea ca diferite tari au reguli diferite despre ceea ce constituie un numar de telefon valid. Deci, pentru a valida fara echivoc un numar de telefon, trebuie sa stiti tara in care a fost emis. Consultati documentul falsurilor legate mai sus pentru cateva exemple de motivul pentru care este necesar.

Pentru a valida corect numarul de telefon furnizat, avem nevoie de utilizatori care sa aleaga tara emitenta in acelasi timp. Asta inseamna ca atunci cand validam numarul de telefon cu Twilio, putem include codul de tara ISO 3166 cu 2 cifre si confirmam daca numarul de telefon este valabil specific pentru tara respectiva.

Adaugarea unui meniu derulant cod de tara

Vom adauga o lista de tari la pagina de gestionare a identitatii core ASP.NET pentru a facilita alegerea utilizatorilor a codului de tara corespunzator.

Pentru a construi lista verticala, vom incarca aceasta lista de tari dintr-un fisier JSON countries.json stocate in folderul proiectului. Un fragment de fisier este prezentat mai jos; puteti gasi un fisier complet in esantion aici.

Elipsa („…”) in blocuri de cod reprezinta o sectiune redusa pentru scurtitate.

[{“Text”: “Statele Unite ale Americii”, “Valoare”: “SUA”}, {“Text”: “Regatul Unit al Marii Britanii si Irlandei de Nord”, “Valoare”: “GB”}, {“Text “:” Canada “,” valoare “:” CA “}, …]

In continuare, vom crea un serviciu pentru incarcarea fisierului JSON si il vom converti intr-o lista <SelectListItem>. Creati fisierul CountryService.cs in radacina proiectului dvs. si adaugati urmatorul cod:

folosind Sistem; folosind System.Collections.Generic; folosind System.IO; folosind Microsoft.AspNetCore.Hosting; folosind Microsoft.AspNetCore.Mvc.Rendering; folosind Newtonsoft.Json; namespace ValidatePhoneNumberDemo {public class CountryService {private readonly IHostingEnvironment _environment; private readonly Lazy <List <SelectListItem>> _countries; public CountryService (IHostingEnvironment environment) {_environment = environment; _countries = new Lazy <List <SelectListItem>> (LoadCountries); } public list <SelectListItem> GetCountries () {return _countries.Value; } Lista privata <SelectListItem> LoadCountries () {var fileInfo = _environment.ContentRootFileProvider.GetFileInfo (“tari.json”); folosind (var stream = fileInfo. CreateReadStream ()) folosind (var streamReader = new StreamReader (stream)) folosind (var jsonTextReader = new JsonTextReader (streamReader)) {var serializer = new JsonSerializer (); returnare serializer.Deserialize <List <SelectListItem>> (jsonTextReader); }}}}}

Acest serviciu foloseste Lazy <> pentru a oferi initializarea lenesa, o optimizare care incarca tarile din fisierul JSON o singura data, atunci cand sunt necesare, intr-o maniera sigura de thread. De asemenea, foloseste suportul de streaming al Newtonsoft.Json pentru a deserializa continutul direct intr-o Lista <SelectListItem>, in loc sa-l incarcati mai intai ca sir. Lista deserializata de tari este expusa prin metoda GetCountries ().

Pentru a utiliza CountryService trebuie sa-l inregistrati la containerul de injectie (DI) al dependentei aplicatiei. Deschideti Startup.cs si adaugati urmatoarea linie la sfarsitul metodei ConfigureServices:

services.AddSingleton <CountryService> ();

Acest lucru inregistreaza serviciul cu containerul DI ca un singleton, astfel incat sa il putem injecta in pagina noastra Razor. Deschideti codul din spatele paginii Razor pentru gestionarea contului la Zonele \ Identitate \ Pagini \ Cont \ Gestionare \ Index.cshtml.cs , adaugati folosind Microsoft.AspNetCore.Mvc.Rendering; in partea de sus a fisierului si injectati o instructiune de CountryService in constructor. Creati o noua proprietate AvailableCountries pe modelul de pagina si utilizati CountryService injectat pentru a atribui lista de tari. Retineti ca daca utilizati Visual Studio, trebuie sa extindeti nodul fisierului Index.cshtml din Exploratorul de solutii pentru a vedea fisierul din spatele codului, Index.cshtml.cs .

namespace ValidatePhoneNumberDemo.Areas.Identity.Pages.Account.Manage {public partial class IndexModel: PageModel {public IndexModel (UserManager <IdentityUser> userManager, SignInManager <IdentityUser> signInManager, IEmailSender emailSender, userSanager _signInManager = semnInManager; _emailSender = emailSender; DisponibilCountries = countryService.GetCountries (); } Public list <SelectListItem> DisponibilCountries {get; } …}}

Modelul nostru de pagini contine acum lista tarilor disponibile, astfel incat sa putem popula lista verticala, dar avem nevoie si de undeva pentru a stoca selectia utilizatorului. Actualizati InputModel cuibarit si adaugati proprietatea PhoneNumberCountryCode:

namespace ValidatePhoneNumberDemo.Areas.Identity.Pages.Account.Manage {public partial class IndexModel: PageModel {public class InputModel {[Obligatoriu] [EmailAddress] public string Email {get; a stabilit; } [Telefon] [Afisare (Nume = „Numar de telefon”)] sir public PhoneNumber {get; a stabilit; } [Afisare (Nume = „Tara numarului de telefon”)] public string PhoneNumberCountryCode {get; a stabilit; }}}}}

In cele din urma, adaugati urmatorul Razor la Zonele \ Identitate \ Pagini \ Cont \ Gestionare \ Index.cshtml , chiar deasupra codului Razor pentru introducerea numarului de telefon.

<div class = “form-group”> <label asp-for = “Input.PhoneNumberCountryCode”> </label> <select asp-for = “Input.PhoneNumberCountryCode” asp-items = “Model.AvailableCountries” class = “formular -control “> </select> <span asp-validation-for =” Input.PhoneNumberCountryCode “class =” text-danger “> </span> </div>

Acest Razor utilizeaza Help Tag Helper pentru a genera un element <select> populat cu valorile din proprietatea AvailableCountries, care se leaga la proprietatea Input.PhoneNumberCountryCode din formularul POST. Daca rulati aplicatia acum si navigati la pagina de gestionare a contului, ar trebui sa vedeti afisarea tarii afisata deasupra optiunii de numar de telefon.

In acest exemplu, nu avem optiunea „none” sau „neselectata” in elementul <select>. In consecinta, primul articol este selectat si trimis inapoi utilizatorului. Acest lucru este OK pentru scopurile noastre, dar o abordare mai cuprinzatoare ar putea fi selectarea tarii implicite in functie de locatia utilizatorului.

Adaugarea validarii numarului de telefon utilizand API-ul Twilio Lookup

In acest moment avem totul la dispozitie pentru a adauga validarea noastra suplimentara; avem clientul Twilio configurat, CountryService incarcand lista noastra de coduri de tara si meniul nostru pentru ca utilizatorul sa isi selecteze tara. Acum vom adauga apelul de validare la API-ul Twilio.

Deschide Index.chstml.cs si adauga urmatorul spatiu de nume folosind instructiuni:

folosind Twilio.Exceptii; folosind Twilio.Rest.Lookups.V1;

Acum inlocuiti urmatorul cod gasit in OnPostAsync:

… var phoneNumber = asteptati _userManager.GetPhoneNumberAsync (utilizator); if (Input.PhoneNumber! = phoneNumber) {var setPhoneResult = asteptati _userManager.SetPhoneNumberAsync (utilizator, Input.PhoneNumber); if (! setPhoneResult.Succeeded) {var userId = asteapta _userManager.GetUserIdAsync (utilizator); throw new InvalidOperationException ($ “A aparut o eroare neasteptata la setarea numarului de telefon pentru utilizator cu ID-ul ‘{userId}’.”); }} …

cu codul nostru actualizat de validare.

step sister porno http://www.home2haven.com/__media__/js/netsoltrademark.php?d=adult66.net/
tinik porno http://1cn.snowhillmd.org/__media__/js/netsoltrademark.php?d=adult66.net/
filme porno granies http://suparegistration.com/__media__/js/netsoltrademark.php?d=adult66.net/
porno c http://www.arcaman.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/amatori
porno filmulete http://www.michaelling.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/anal
porno daniela crudu http://klione.danirvinrather.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/asiatice
torpe porno http://wembleystadium.ws/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/beeg
porno m http://www.lidonuts.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/blonde
filme:porno http://www.gallerygoods.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brazzers
porno categorii http://dbccollectibles.com/SP/FSP.php?product=Happily+Ever+After+Mickey+And+minnie+5×7+Frame&id=lx819194&price=79.00&page_title=Disney+Wedding+Cake+Toppers&desc=&formLink=disney_wedding_form.php&link=https://adult66.net/filme-porno/brunete
filme porno anal http://proudconsulting.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/chaturbate
porno cu laba http://www.millennium-sensor.com/__media__/js/netsoltrademark.php?d=adult66.net/pustoaica-18-ani-e-fututa-de-iubitul-ei-si-de-fratele-lui-in-acelasi-timp
filme porno cu limbi in pizda http://www.hay4sale.com/__media__/js/netsoltrademark.php?d=adult66.net/papusica-blonda-e-dezvirginata-in-cur-de-prietenul-mai-mare-care-ejaculeaza-pe-fata-ei
filme porno online gratis orgasm fortat http://e-cbt.net/__media__/js/netsoltrademark.php?d=adult66.net/nevasta-singura-acasa-e-fututa-pe-fotoliu-de-prietenul-fiului-venit-in-vizita
porno it http://ww17.salemunited.com/__media__/js/netsoltrademark.php?d=adult66.net/o-tanara-cu-un-super-fund-face-sex-animalic-pe-la-spate
xnx porno http://www.accessworldnews.net/__media__/js/netsoltrademark.php?d=adult66.net/un-cuplu-de-negri-fac-un-film-pono-amator-cu-sex-anal-sex-oral-si-orgasm
porno cu alina plugaru http://www.componentmarketing.com/__media__/js/netsoltrademark.php?d=adult66.net/doua-lesbiene-superbe-fac-sex-in-diferite-pozitii-si-au-orgasm
paroase porno http://celeb.tangohot.com/__media__/js/netsoltrademark.php?d=adult66.net/o-creola-drogata-e-obligata-sa-faca-sex-oral-la-mai-multi-intr-o-discoteca
filme porno cu desene http://delmarvacentral.com/__media__/js/netsoltrademark.php?d=adult66.net/o-blonda-romanca-e-fututa-pe-un-iaht-si-filmata
porno cenusareasa http://mousehole.com/__media__/js/netsoltrademark.php?d=adult66.net/o-bruneta-sexy-suge-pula-intr-un-stil-profesionist-pana-ejaculeaza-in-gura

Aveti grija sa pastrati codul atat deasupra cat si sub fragmentul pe care il inlocuiti:

… var phoneNumber = asteptati _userManager.GetPhoneNumberAsync (utilizator); if (Input.PhoneNumber! = phoneNumber) {try {var numberDetails = asteptati PhoneNumberResource.FetchAsync (pathPhoneNumber: new Twilio.Types.PhoneNumber (Input.PhoneNumber)), countryCode: Input.PhoneNumberCountryCode, type: new {List> “}); var phoneNumberType = numberDetails.GetPhoneNumberType (); if (phoneNumberType! = null && phoneNumberType == PhoneNumberResource.TypeEnum.Landline) {ModelState.AddModelError ($ “{nameof (Input)}. {nameof (Input.PhoneNumber)}”, $ “Numarul introdus nu pare sa fie sa poata primi SMS ({phoneNumberType}). Va rugam sa introduceti o alta valoare si incercati din nou “); returnare pagina (); } var numberToSave = numberDetails.PhoneNumber.ToString (); var setPhoneResult = asteptati _userManager. SetPhoneNumberAsync (utilizator, numarToSave); if (! setPhoneResult.Succeeded) {var userId = asteapta _userManager.GetUserIdAsync (utilizator); throw new InvalidOperationException ($ “A aparut o eroare neasteptata la setarea numarului de telefon pentru utilizator cu ID-ul ‘{userId}’.”); }} catch (ApiException ex) {ModelState.AddModelError ($ “{nameof (Input)}. {nameof (Input.PhoneNumber)}”, $ “Numarul introdus nu era valid (cod Twilio {ex.Code}), verificati si incercati din nou “); returnare pagina (); }} …

Acesta este un cod de digerat, asa ca il voi parcurge mai jos.

Inainte de a face ceva cu numarul de telefon, incarcam numarul existent pentru utilizatorul Identity si verificam daca acesta a fost schimbat. Daca numarul nu s-a schimbat, nu este nevoie sa il validati, sa apelati Twilio API sau sa actualizati valoarea.

var phoneNumber = asteptati _userManager.GetPhoneNumberAsync (utilizator); if (Input.PhoneNumber! = PhoneNumber) {}

Daca numarul s- a schimbat, trebuie sa validam valoarea folosind API-ul Twilio Lookup. Folosim asistentul PhoneNumberResource pentru a efectua un apel asincron catre API-ul Twilio, trecand de la InputModel la numarul de telefon PhoneNumber si PhoneNumberCountryCode. Invelim apelul intr-un bloc try-catch, deoarece va arunca o exceptie daca este nevalid. In acest caz, afisam o eroare generica si redimensionam formularul. Puteti, de asemenea, sa inregistrati exceptia, dar aveti grija sa stocati informatii de identificare personala (PII) in mesajele de jurnal.

incercati {var numberDetails = asteptati PhoneNumberResource.FetchAsync (pathPhoneNumber: new Twilio.Types.PhoneNumber (Input.PhoneNumber)), countryCode: Input.PhoneNumberCountryCode, tip: new List <string> {“carrier”}); } catch (ApiException ex) {ModelState.AddModelError ($ “{nameof (Input)}. {nameof (Input.PhoneNumber)}”, $ “Numarul introdus nu era valid (cod Twilio {ex.Code}), va rog verificati-l si incercati din nou “); returnare pagina (); }

Retineti ca am adaugat eroarea ca eroare de proprietate, incluzand numele campului in apelul catre AddModelError (). Asta inseamna ca eroarea va fi afisata langa campul cu numarul de telefon, precum si in Ajutor pentru eticheta rezumat validare in mod implicit. Am inclus, de asemenea, codul Twilio in mesajul de eroare in scop demonstrativ. In practica, probabil ca nu veti dori sa expuneti acest lucru utilizatorilor, dar poate doriti sa il utilizati in scopuri de inregistrare si metrica.

Pe langa validarea numarului, in acest exemplu am solicitat, de asemenea, informatii de transportator pentru acest numar, trecand „operator” la parametrul tip de FetchAsync (). Acest lucru nu este necesar pentru validarea in sine, dar poate oferi informatii suplimentare utile pentru unele cazuri de utilizare a afacerii. Inclusiv „transportatorul” returneaza, de asemenea, tipul probabil de numar de telefon.

Extragem tipul de numar de telefon din raspuns, avand grija sa gestionam nulurile si valorile lipsa. Tipul de numar de telefon are una dintre cele trei valori de sir: fix, mobil sau voip. Folosim aceasta valoare pentru a incerca sa stabilim daca numarul poate primi SMS. Daca nu se poate, redimensionam formularul si il facem pe utilizator sa introduca o valoare diferita.

var phoneNumberType = numberDetails.GetPhoneNumberType (); if (phoneNumberType! = null && phoneNumberType == PhoneNumberResource.TypeEnum.Landline) {ModelState.AddModelError ($ “{nameof (Input)}. {nameof (Input.PhoneNumber)}”, $ “Numarul introdus nu apare sa poata primi SMS ({phoneNumberType}). Va rugam sa introduceti o alta valoare si incercati din nou “); returnare pagina (); }

Acest comportament poate fi nedorit in multe cazuri; o abordare mai buna ar putea fi intoarcerea unui avertisment, dar totusi sa salvezi numarul. In orice caz, singura modalitate de a fi sigur daca numarul poate primi SMS sau voce este sa incercati sa-l trimiteti sau sa il sunati, folosind de exemplu API-ul Twilio Verify.

Dupa ce am validat numarul de telefon cu API-ul lui Twilio si am confirmat ca nu este un numar fix, salvam numarul de telefon pentru utilizatorul Identity. Acest cod este in esenta acelasi ca inainte de a adauga personalizarile noastre cu o singura exceptie – in loc sa salvam numarul asa cum a fost introdus de utilizator, stocam numarul formatat in format E.164 . Aceasta are avantajul de a nu ne solicita sa stocam codul tarii (asa cum este continut in numarul formatat).

var numberToSave = numberDetails.PhoneNumber.ToString (); var setPhoneResult = asteptati _userManager.SetPhoneNumberAsync (utilizator, numarToSave); if (! setPhoneResult.Succeeded) {var userId = asteapta _userManager.GetUserIdAsync (utilizator); throw new InvalidOperationException ($ “A aparut o eroare neasteptata la setarea numarului de telefon pentru utilizator cu ID-ul ‘{userId}’.”); }

Cu acest cod in loc, puteti testa validarea in propria aplicatie. Cand un numar nu reuseste validarea lui Twilio, veti vedea mesajul de eroare afisat mai jos in partea stanga sus. Cand trece validarea, dar este o linie fixa, veti vedea mesajul de eroare in partea stanga jos. In cele din urma, atunci cand trece toata validarea si nu este o linie fixa, veti vedea ca numarul este actualizat la formatul E.164 (formatul +1) asa cum se arata in dreapta.

Metoda de extensie pentru extragerea tipului de numar de telefon din obiectul PhoneResource este prezentata mai jos. Gestioneaza nulurile, precum si cazurile in care este posibil sa nu fi solicitat tipul folosind argumentul „transportator”.

folosind Twilio.Rest.Lookups.V1; namespace ValidatePhoneNumberDemo {public static class PhoneNumberResourceExtensions {public static PhoneNumberResource.TypeEnum GetPhoneNumberType (acest PhoneNumberResource phoneNumber) {if (phoneNumber? .Carrier! = null && phoneNumber.Carrier.TryGet “Raw”. } returnare nula; }}}

Este important sa ne amintim ca validarea unui numar utilizand libfonenumber sau API-ul Twilio Lookup (asa cum am facut in acest post) este de obicei doar primul pas intr-un proces cu mai multe etape pentru a verifica un utilizator sa controleze un numar de telefon. Inainte de a utiliza numarul de telefon in scop comercial, ar trebui sa confirmati ca utilizatorul are acces la dispozitiv fie prin trimiterea unui mesaj de verificare / apel telefonic, de exemplu, folosind API-ul Twilio Verify.

rezumat

In aceasta postare am aratat cum puteti imbunatati validarea numarului de telefon in ASP.NET Core Identity folosind API-ul Twilio Lookup. Am aratat cum esafodeaza paginile cu identitatea principala ASP.NET, astfel incat sa poata fi personalizate folosind instrumentul global dotnet-aspnet-codegenerator si cum sa incarci tarile pentru o lista derulanta dintr-un fisier JSON. Este important sa includeti tara la validarea numerelor de telefon, deoarece diferite tari au reguli diferite.

API-ul Twilio Lookup foloseste biblioteca libronenumerului pentru a verifica daca numarul de telefon este valid, dar poate returna informatii suplimentare precum transportatorul, tipul de numar de telefon sau detaliile de frauda. Pentru o verificare completa a faptului ca utilizatorul detine numarul de telefon, ar trebui sa luati in considerare utilizarea Twilio Verify API pentru a trimite un mesaj / apel la numarul de telefon.

Resurse aditionale

Pentru o introducere in paginile Razor, consultati postarea mea anterioara sau resursa excelenta, https://www.learnrazorpages.com/. Pentru mai multe informatii despre numerele de telefon si de ce sunt dificile, consultati Programatorii falsiti cred ca sunt numere de telefon. Pentru o postare cu privire la utilizarea biblionumenului direct in aplicatia dvs. ASP.NET Core, consultati acest post pe blogul Twilio.