Asiakkaan toimeksiantona sovellus nimeltä SlowDown. Loin selainpohjaisen sovelluksen, jolla opiskelijat voivat esittää hidastuspyynnön etäopetustilanteessa opettajalle, mikäli opetuksen tahti koetaan liian nopeaksi.
Ensimmäisessä versiossa tavoitteena oli toteuttaa C#-koodilla ASP.NET Core -sovelluksen, joka pyörii Azuren pilvessä Azuren App Service -palvelussa. Sovellukseen sisällytetään SignalR -teknologiaa, jotta reaaliaikaista tietoa hidastuspyyntöjen määrästä voidaan seurata ilman erillisen pilvipalvelun käyttöönottoa. SignalR sisällytetään App Servicen sisään kustannustehokkuuden vuoksi sen sijaan, että SignalR otettaisiin käyttöön erillisenä palveluna.
Sovelluksessa luodaan avain erillisessä näkymässä. Avain tallennetaan JSON-tiedostoon, joka tallennetaan Azuren blob containeriin. Avaimeen ei sisällytetä ylimääräistä dataa vaan avain tulee olemaan pelkkä merkkijono. Avaimen voi luoda vain erillisessä näkymässä ja avaimen voi luoda vain haluttu, tunnistettu henkilö. Alkuun tunnistus tapahtuu yksinkertaisen admin -salasanan avulla.
Luokkahuoneeseen kirjaudutaan luodulla avaimella ja luokkahuonenäkymässä on nappi, jota painamalla voi lähettää hidastuspyynnön. Hidastuspyynnöstä tulee käyttäjän näkymään indikaatio.
Luokkahuone ei ole koko ajan olemassa vaan se luodaan aina ensimmäisen käyttäjän kirjautuessa istuntoon. Luokkahuoneessa käyttäjistä ei kerätä mitään yksilöiviä tietoja. Käyttäjien määrä kuitenkin lasketaan.
Luokkahuoneen avaimeen tallennetaan lisätietoa avaimen nimen lisäksi. Avaimeen sisältyy luomispäivä, voimassaoloaika sekä kurssin nimi. Kaikki lisätiedot ovat näkyvissä vain avaingeneraattorissa ja niitä käytetään pelkästään avainten listaukseen sekä suodatukseen käyttöliittymässä.
Hidastuspyyntönappia painamalla käyttäjä lähettää sovellukselle pyynnön hidastuksesta. Sovellus rekisteröi painalluksen, päivittää hidastuspyyntölistaa, laskee prosentuaalisen arvon hidastusta pyytävistä käyttäjistä kokonaiskäyttäjämäärästä ja palauttaa kaikille clienteille indikaation hidastuspyynnön painalluksesta sekä prosentuaalisen arvon hidastuspyynnön aktivoineista käyttäjistä.
Käytämme edelleen SignalR:n tuomaa PUSH-teknologiaa hyväksemme, jotta saamme lähetettyä hidastuspyyntötietoja koskevat tiedot clienteille. Kustannustehokkuuden vuoksi SignalR on kirjoitettu koodiin sisään käyttämään App Servicen resursseja sen sijaan, että se tulisi erillisen pilvipalvelun kautta. Koska SignalR on kirjoitettu koodiin sisään ja haluamme sitä tietyllä tavalla hyväksi käyttämään, joudumme pakottamaan kaikki clientit käyttämään long polling -teknologiaa viestin kuljettamiseen. Transport layerissa signalR -viestit tyypillisesti kuljetetaan käyttäen WebSocketeja, mutta websocketien rajoitusten vuoksi ja kustannustehokkuutta priorisoiden joudumme käyttämään vanhempaa long polling -teknologiaa, joka ei täysin optimaalinen ratkaisu viestien lähetykseen ole, mutta se mahdollistaa sovelluksemme käytön minimaalisilla kustannuksilla ja saamme silti simuloitua käyttäjälle reaaliaikaisuutta hidastuspyyntöjen suhteen.
Käyttöliittymään käytetään bootstrapin tarjoamia komponentteja.
Luokkahuoneita eli sessioita ei erikseen tallenneta mihinkään tiedostoon saati tietokantaan. Istunnot elävät Dictionary -rakennetta käyttäen sovellusprosessin välimuistissa. Istunnon päätyttyä välimuisti tyhjenee.
Sovellukseen on implementoitu pieni kielipaketti, joka tukee tällä hetkellä kieliä: Suomi, Ruotsi, Englanti, Ukraina ja Venäjä. Sovellus käyttää .resx-resurssitiedostoihin perustuvaa ASP.NET Core Localization -teknologiaa eri kieliversioiden hallinnassa.
Sovelluksen käyttöliittymä tukee ruudunlukijoita hyödyntäen WCAG 2.1 -periaatteita ja ARIA-standardia. Toteutus perustuu semanttiseen HTML-rakenteeseen sekä ARIA-attribuutteihin, joiden avulla dynaamiset ja ei-visuaaliset elementit voidaan tulkita oikein apuvälineille.
Avaingeneraattorin endpointit on suojattu X-admin-key -headerilla eli sovelluksen hallintarajapinnat on suojattu lisäämällä niihin erillinen palvelinpuolen API-avain, jota ei koskaan lähetetä selaimelle. Lopputuloksena on, että POST/DELETE/PUT -kutsut ovat täysin estettyjä ulkopuolelta.
Adminin salasana avaingeneraattoriin on myös suojattu modernilla .NET Identity -hashauksella. PBKDF2-algoritmilla hashattuna ja satunnaisesti suolattuna salasana pysyy turvallisena vaikka hashatun salasanan saisikin hyökkääjä haltuunsa pilvestä.
Api-avain sekä adminin hashattu salasana on piilotettu Azuren KeyVault -palveluun.
Luokkahuoneen hidastusnappulan rajapintaa ei ole erikseen avaimella suojattu vaan rajapinnan kutsu on backendin puolella rajoitettu client-pohjaisesti eli kutsua ei voi kukaan tehdä kuin vain ja ainoastaan 30 sekunnin intervalleilla.