{"id":58,"date":"2011-12-24T13:12:00","date_gmt":"2011-12-24T13:12:00","guid":{"rendered":"http:\/\/tpodolak.com.hostingasp.pl\/blog\/2011\/12\/24\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/"},"modified":"2016-01-31T00:25:22","modified_gmt":"2016-01-31T00:25:22","slug":"silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1","status":"publish","type":"post","link":"https:\/\/tpodolak.com\/blog\/2011\/12\/24\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/","title":{"rendered":"Silverlight &#8211; koncepcja logowania z u\u017cyciem MembershipProviders oraz WCF RIA cz.1"},"content":{"rendered":"<p>W dzisiejszym wpisie postaram si\u0119 przedstawi\u0107 moj\u0105 koncepcj\u0119 logowania do aplikacji Silverlightowej z wykorzystaniem MembershipProviders oraz w\u0142asnego AuthenticationService.<br \/>\nZacznijmy od stworzenia bazy danych, w kt\u00f3rej b\u0119dziemy przetrzymywa\u0107 informacje o u\u017cytkownikach &#8211; has\u0142a, role itp. Baz\u0119 danych stworzymy przy u\u017cyciu narz\u0119dzia <span style=\"font-weight: bold;\">aspnet_regsql.exe<\/span>, kt\u00f3re to wygeneruje schemat bazy danych dostosowany do mo\u017cliwo\u015bci SqlMembershipProvider-a. <span style=\"font-weight: bold;\">aspnet_regsql.exe<\/span> znajduje si\u0119 w katalogu <span style=\"font-weight: bold;\">C:WINDOWS\\Microsoft.NET\\Framework\\wersjaFrameworka\\aspnet_regsql.exe.<\/span> Czyli w moim przypadku jest to <span style=\"font-weight: bold;\">C:WINDOWS\\Microsoft.NET\\Frameworkv\\4.0.30319\\aspnet_regsql.exe<\/span>.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/regsql.jpg\" rel=\"attachment wp-att-469\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/regsql.jpg\" alt=\"regsql\" width=\"600\" class=\"aligncenter size-full wp-image-469\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/regsql.jpg 1080w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/regsql-150x79.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/regsql-300x157.jpg 300w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/regsql-1024x537.jpg 1024w\" sizes=\"(max-width: 1080px) 100vw, 1080px\" \/><\/a><br \/>\nKlikaj\u0105c podw\u00f3jnie na ikon\u0119 aplikacji pojawia nam si\u0119 nast\u0119puj\u0105ce okno<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard.jpg\" rel=\"attachment wp-att-471\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard.jpg\" alt=\"wizzard\" width=\"600\" class=\"aligncenter size-full wp-image-471\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard.jpg 590w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard-150x115.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard-300x229.jpg 300w\" sizes=\"(max-width: 590px) 100vw, 590px\" \/><\/a><br \/>\nKlikamy w przycisk &#8220;Dalej&#8221;. W kolejnym oknie mamy do wyboru dwie opcje<\/p>\n<ul>\n<li>Configure SQL Server for application services<\/li>\n<li>Remove application services from an existing database<\/li>\n<\/ul>\n<p>Pierwsza opcja odpowiedzialna jest za stworzenie struktury danych do naszego sytemu logowania, natomiast druga usuwa z bazy danych tabele s\u0142u\u017c\u0105ce do logowania itp. Wybieramy opcj\u0119 bramk\u0119 nr 1. W kolejnym oknie musimy poda\u0107 connection string do naszego serwera bazy danych oraz login i has\u0142o. W moim przypadku wygl\u0105da to w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p><a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard2.jpg\" rel=\"attachment wp-att-472\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard2.jpg\" alt=\"wizzard2\" width=\"600\" class=\"aligncenter size-full wp-image-472\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard2.jpg 585w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard2-150x116.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard2-300x233.jpg 300w\" sizes=\"(max-width: 585px) 100vw, 585px\" \/><\/a><\/p>\n<p>Je\u017celi wszystko p\u00f3jdzie OK poka\u017ce si\u0119 nam nast\u0119puj\u0105ce okno, w kt\u00f3rym to mo\u017cemy zobaczy\u0107, \u017ce zosta\u0142a stworzona baz danych <span style=\"font-weight: bold;\">aspnetdb<\/span><\/p>\n<p><a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard3.jpg\" rel=\"attachment wp-att-473\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard3.jpg\" alt=\"wizzard3\" width=\"600\" class=\"aligncenter size-full wp-image-473\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard3.jpg 588w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard3-150x116.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard3-300x231.jpg 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/a><\/p>\n<p>Ostatecznie klikamy na przycisk &#8220;Next&#8221;,a nast\u0119pnie w &#8220;Finish&#8221; aby doko\u0144czy\u0107 dzia\u0142anie kreatora<\/p>\n<p><a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard4.jpg\" rel=\"attachment wp-att-474\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard4.jpg\" alt=\"wizzard4\" width=\"600\" class=\"aligncenter size-full wp-image-474\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard4.jpg 588w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard4-150x115.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/wizzard4-300x231.jpg 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/a><\/p>\n<p>Maj\u0105c gotow\u0105 baz\u0119 danych mo\u017cemy przyst\u0105pi\u0107 do w\u0142a\u015bciwego kodowania. Zacznijmy od stworzenia nowego projektu typu &#8220;Silverlight Application&#8221;<\/p>\n<p><a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/silverlightapp.jpg\" rel=\"attachment wp-att-470\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/silverlightapp.jpg\" alt=\"silverlightapp\" width=\"600\" class=\"aligncenter size-full wp-image-470\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/silverlightapp.jpg 958w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/silverlightapp-150x92.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/silverlightapp-300x184.jpg 300w\" sizes=\"(max-width: 958px) 100vw, 958px\" \/><\/a><br \/>\npo klikni\u0119ciu przycisku &#8220;OK&#8221; w\u0142\u0105czamy WCF RIA Service<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/EnableWCF.jpg\" rel=\"attachment wp-att-468\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/EnableWCF.jpg\" alt=\"EnableWCF\" width=\"600\" class=\"aligncenter size-full wp-image-468\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/EnableWCF.jpg 524w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/EnableWCF-150x121.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/EnableWCF-300x241.jpg 300w\" sizes=\"(max-width: 524px) 100vw, 524px\" \/><\/a><\/p>\n<p>Maj\u0105c stworzony szkielet aplikacji mo\u017cemy zabra\u0107 si\u0119 za napisanie w\u0142asnego AuthenticationService. Do projektu webowego (nazwaprojektu.Web) dodajmy nowy element typu &#8220;Domain Service&#8221;. PPM na projekt, nast\u0119pnie &#8220;Add new item&#8221;, w oknie kt\u00f3re si\u0119 otworzy wybieramy &#8220;Domain Service&#8221;. Nadajemu mu nazw\u0119 <span style=\"font-style: italic;\">CustomAuthenticationService.cs<\/span><\/p>\n<p><a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AddItemSmall.jpg\" rel=\"attachment wp-att-464\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AddItemSmall.jpg\" alt=\"AddItemSmall\" width=\"600\"  class=\"aligncenter size-full wp-image-464\" \/><\/a><\/p>\n<p><a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/DomainServiceClass.jpg\" rel=\"attachment wp-att-467\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/DomainServiceClass.jpg\" alt=\"DomainServiceClass\" width=\"600\" class=\"aligncenter size-full wp-image-467\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/DomainServiceClass.jpg 960w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/DomainServiceClass-150x103.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/DomainServiceClass-300x207.jpg 300w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/a><\/p>\n<p>Nasza w\u0142a\u015bnie dodana klasa powinna wygl\u0105da\u0107 mniej wi\u0119cej w taki spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\nnamespace MainModule.Web\r\n{\r\n    using System;\r\n    using System.Collections.Generic;\r\n    using System.ComponentModel;\r\n    using System.ComponentModel.DataAnnotations;\r\n    using System.Linq;\r\n    using System.ServiceModel.DomainServices.Hosting;\r\n    using System.ServiceModel.DomainServices.Server;\r\n\r\n    \/\/ TODO: Create methods containing your application logic.\r\n    [EnableClientAccess()]\r\n    public class CustomAuthenticationService: DomainService\r\n    {\r\n    }\r\n}\r\n<\/pre>\n<p>W nast\u0119pnym kroku zaimplementujmy w klasie <span style=\"font-style: italic;\">CustomAuthenticationService<\/span> interfejs<br \/>\n<span style=\"font-style: italic;\"> IAuthentication<T> where T: IUser<\/span>. Interfejs ten wygl\u0105da w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre lang=\"csharp\">\r\npublic interface IAuthentication<T> where T: IUser\r\n{\r\n    T GetUser();\r\n    T Login(string userName, string password, bool isPersistent, string customData);\r\n    T Logout();\r\n    void UpdateUser(UserDTO user);\r\n}\r\n<\/pre>\n<p>Widzimy zatem, \u017ce zanim go zaimplementujemy musimy posiada\u0107 obiekt implementuj\u0105cy inny interfejs &#8211; <span style=\"font-style: italic;\">IUser<\/span>. Przyst\u0105pmy zatem do stworzenia naszej klasy modeluj\u0105cej u\u017cytkownika &#8211; nazwijmy j\u0105 <span style=\"font-style: italic;\">UserDTO<\/span>.Stw\u00f3rzmy nowy projekt typu &#8220;Class library&#8221;. W projekcie tym stw\u00f3rzmy klas\u0119 <span style=\"font-style: italic;\">UserDTO<\/span>, kt\u00f3ra b\u0119dzie dziedziczy\u0142a po klasie <span style=\"font-style: italic;\">UserBase<\/span> znajduj\u0105cej si\u0119 w przestrzeni nazw <span style=\"font-style: italic;\">System.ServiceModel.DomainServices.Server.ApplicationServices<\/span><\/p>\n<pre lang=\"csharp\">\r\npublic class UserDTO : UserBase\r\n{\r\n    public string Email { get; set; }\r\n    public string DisplayName { get; set; }\r\n}\r\n<\/pre>\n<p>Maj\u0105c gotow\u0105 klas\u0119 reprezentuj\u0105c\u0105 u\u017cytkownika zaimplementujmy w ko\u0144cu w klasie CustomAuthenticationService interfejs IAuthentication. Po implementacji interfejsu nasz serwis wygl\u0105da w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre lang=\"csharp\">\r\n[EnableClientAccess()]\r\npublic class CustomAuthenticationService: DomainService, IAuthentication\r\n{\r\n    public UserDTO GetUser()\r\n    {\r\n        throw new NotImplementedException();\r\n    }\r\n    \r\n    public UserDTO Login(string userName, string password, bool isPersistent, string customData)\r\n    {\r\n        throw new NotImplementedException();\r\n    }\r\n    \r\n    public UserDTO Logout()\r\n    {\r\n        throw new NotImplementedException();\r\n    }\r\n    \r\n    public void UpdateUser(UserDTO user)\r\n    {\r\n        throw new NotImplementedException();\r\n    }\r\n}\r\n<\/pre>\n<p>Pozostaje nam &#8220;tylko&#8221; zaimplementowa\u0107 odpowiednie metody. Funkcja kt\u00f3ra nas najbardziej interesuje to oczywi\u015bcie funkcja logowania. Przy jej implementacji pos\u0142u\u017cy si\u0119 mechanizmem znanym z ASP mianowicie z <span style=\"font-style: italic;\">MembershipProviders<\/span>. Klasa <span style=\"font-style: italic;\">MembershipProvider <\/span>jest to abstrakcyjna klasa posiadaj\u0105ca szereg funkcji maj\u0105cej na celu walidowanie poprawnego u\u017cytkownika, rejestracj\u0119 itp. Stw\u00f3rzmy zatem w\u0142asn\u0105 klas\u0119 providera dziedzicz\u0105c\u0105 po klasie <span style=\"font-style: italic;\">MembershipProvicer<\/span>. .NET dostarcza nam domy\u015blny provider, kt\u00f3rym jest <span style=\"font-style: italic;\">SqlMembershipProvider<\/span>, jest on napisany w taki spos\u00f3b, aby m\u00f3g\u0142 porozumiewa\u0107 si\u0119 z baz\u0105, kt\u00f3r\u0105 stworzyli\u015bmy na pocz\u0105tku. Aby wykorzysta\u0107 wspomnianego wcze\u015bniej providera musimy odpowiednio zmodyfikowa\u0107 plik <span style=\"font-style: italic;\">Web.config<\/span>. Po pierwsze dodajemy do niego ConnectionString do naszej bazy danych, w moim przypadku b\u0119dzie to wygl\u0105da\u0142o w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\n<connectionStrings>\r\n    <add name=\"aspnetdbConnectionString\" connectionString=\"Data Source=TOMEKKOMPUTERSQLEXPRESSRC2;Initial Catalog=aspnetdb;Integrated Security=True\"\r\n      providerName=\"System.Data.SqlClient\" \/>\r\n<\/connectionStrings>\r\n<\/pre>\n<p>Nast\u0119pnie musimy &#8220;pokaza\u0107&#8221; naszej aplikacji, \u017ce b\u0119dziemy u\u017cywa\u0107 FormsAuthentication oraz MembershipProvider-ow. Dorzu\u0107my zatem do config nast\u0119puj\u0105ce rzeczy:(w sekcji system.web)<\/p>\n<pre lang=\"xml\">\r\n<authentication mode=\"Forms\" \/>\r\n<\/pre>\n<p>nast\u0119pnie dorzucamy do kolekcji provider\u00f3w SqlMembershipProvider<\/p>\n<pre lang=\"xml\">\r\n<membership\r\n            defaultProvider=\"PremiumHandsMembershipProvider\"\r\n            userIsOnlineTimeWindow=\"20\">\r\n      <providers>\r\n        <clear\/>\r\n        <add name=\"PremiumHandsMembershipProvider\"\r\n             connectionStringName=\"aspnetdbConnectionString\"\r\n            type=\"System.Web.Security.SqlMembershipProvider\"\r\n            enablePasswordRetrieval=\"false\"\r\n            enablePasswordReset=\"false\"\r\n            requiresQuestionAndAnswer=\"true\"\r\n            passwordFormat=\"Hashed\"\r\n            applicationName=\"\/\" \/>\r\n      <\/providers>\r\n<\/membership>\r\n<\/pre>\n<p>We wpisach tych dorzucili\u015bmy mo\u017cliwo\u015b\u0107 autentykacji poprzez providery, ustawili\u015bmy SqlMembershipProvider jako domy\u015blny provider, oraz dorzucili\u015bmy go do listy wszystkich provider\u00f3w. W celu sprawdzenia czy nasza konfiguracja jest poprawna mo\u017cemy pos\u0142u\u017cy\u0107 si\u0119 mechanizmem dostarczonym nam przez Visual Studio. Klikamy &#8220;Projekt&#8221;, a nast\u0119pnie ASP.NET Configuration<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/ASPConfiguration.jpg\" rel=\"attachment wp-att-466\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/ASPConfiguration.jpg\" alt=\"ASPConfiguration\" width=\"600\" class=\"aligncenter size-full wp-image-466\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/ASPConfiguration.jpg 442w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/ASPConfiguration-136x150.jpg 136w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/ASPConfiguration-272x300.jpg 272w\" sizes=\"(max-width: 442px) 100vw, 442px\" \/><\/a><br \/>\nZostaniemy przeniesieni do domy\u015blnej przegl\u0105darki internetowej, a naszym oczom uka\u017ce si\u0119 nast\u0119puj\u0105ca strona.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AdminTool.jpg\" rel=\"attachment wp-att-465\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AdminTool.jpg\" alt=\"AdminTool\" width=\"800\"  class=\"aligncenter size-full wp-image-465\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AdminTool.jpg 1600w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AdminTool-150x55.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AdminTool-300x109.jpg 300w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/12\/silverlight-koncepcja-logowania-z-uzyciem-membershipproviders-oraz-wcf-ria-cz-1\/AdminTool-1024x372.jpg 1024w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><\/a><br \/>\nZ poziomu tej stronki mo\u017cemy dodawa\u0107 u\u017cytkownik\u00f3w, przydziela\u0107 im role itp, dzi\u0119ki czemu mo\u017cemy szybko sprawdzi\u0107 czy podstawowe funkcje naszego providera dzia\u0142aj\u0105, oraz czy nasza konfiguracja zosta\u0142a przeprowadzona prawid\u0142owo. Wracaj\u0105c natomiast do naszego systemu logowania, pozosta\u0142o nam jedynie odpowiednio zmodyfikowa\u0107 funkcj\u0119 odpowiedzialn\u0105 za logowanie.Robimy to w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre lang=\"csharp\">\r\nprotected  UserDTO ValidateCredentials(string name, string password, string customData, out string userData)\r\n{\r\n    UserDTO user = null;\r\n    userData = null;\r\n    \r\n    if (Membership.Provider.ValidateUser(name, password))\r\n    {\r\n        userData = name;\r\n        user =  new UserDTO {DisplayName = name,Name = name,Email = name};\r\n    }\r\n    \r\n    if (user != null) userData = name;\r\n    \r\n    return user;\r\n}\r\n\r\npublic UserDTO Login(string userName, string password, bool isPersistent, string customData)\r\n{\r\n    string userData;\r\n    UserDTO user = ValidateCredentials(userName, password, customData, out userData);\r\n    \r\n    if (user != null)\r\n    {\r\n        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(\/* version *\/ 1, userName,\r\n                                                   DateTime.Now, DateTime.Now.AddMinutes(30),\r\n                                                   isPersistent,\r\n                                                   userData,\r\n                                                   FormsAuthentication.FormsCookiePath);\r\n                                                   \r\n        string encryptedTicket = FormsAuthentication.Encrypt(ticket);\r\n        HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);\r\n        HttpContextBase httpContext = (HttpContextBase)ServiceContext.GetService(typeof(HttpContextBase));\r\n        httpContext.Response.Cookies.Add(authCookie);\r\n    }\r\n    else\r\n    {\r\n        HttpContextBase httpContext = (HttpContextBase)ServiceContext.GetService(typeof(HttpContextBase));\r\n        httpContext.AddError(new FormsAuthenticationLogonException(\"Nieprawid\u0142owy login lub has\u0142o\"));\r\n    }\r\n    return user;\r\n}\r\n<\/pre>\n<p>W funkcji <span style=\"font-style: italic;\">ValidateCredentials<\/span> odbywa si\u0119 sprawdzanie czy u\u017cytkownik poda\u0142 w\u0142a\u015bciwe has\u0142o oraz login. Do walidacji wykorzystujemy dodany wcze\u015bniej SqlMembershipProvider &#8211; w\u0142a\u015bciwo\u015b\u0107 <span style=\"font-style: italic;\">Membership.Provider<\/span> zawsze zwraca obiekt domy\u015blnie zdefiniowanego providera. W przypadku gdy walidacja si\u0119 powiedzie tworzymy obiekt u\u017cytkownika, a nast\u0119pnie tworzymy i szyfrujemy <span style=\"font-style: italic;\">FormsAuthenticationTicket<\/span> oraz tworzymy ciasteczko (cookie), kt\u00f3re przesy\u0142amy w responsie wysy\u0142anym przez serwer do klienta. Mechanizm logowania jest ju\u017c prawie gotowy. Musimy jedynie zaimplementowa\u0107 jeszcze pozosta\u0142e funkcje interfejsu IAuthentication.Nie ma raczej w nich nic trudnego<\/p>\n<pre lang=\"csharp\">\r\n\r\npublic UserDTO Logout()\r\n{\r\n    FormsAuthentication.SignOut();\r\n    return null;\r\n}\r\n\r\npublic UserDTO GetUser()\r\n{\r\n    IPrincipal currentUser = ServiceContext.User;\r\n    \r\n    if ((currentUser != null) && currentUser.Identity.IsAuthenticated)\r\n    {\r\n        FormsIdentity userIdentity = currentUser.Identity as FormsIdentity;\r\n        if (userIdentity != null)\r\n        {\r\n            FormsAuthenticationTicket ticket = userIdentity.Ticket;\r\n            if (ticket != null && !ticket.Expired)\r\n            {\r\n                 return new UserDTO { DisplayName = currentUser.Identity.Name, Name = currentUser.Identity.Name };\r\n            }\r\n        }\r\n    }\r\n    \r\n    return null;\r\n}\r\n<\/pre>\n<p>Funkcja <span style=\"font-style: italic;\">Logout <\/span>po prostu wywo\u0142uje funkcj\u0119 <span style=\"font-style: italic;\">SingOut<\/span> z klasy <span style=\"font-style: italic;\">FormsAuthentication<\/span>. Natomiast funkcja <span style=\"font-style: italic;\">GetUser<\/span> zwraca zalogowanego u\u017cytkownika. W funkcji tej najpierw sprawdzamy czy u\u017cytkownik jest zalogowany (do tego celu u\u017cywamy zmiennej <span style=\"font-style: italic;\">IsAuthenticated<\/span>), a nast\u0119pnie sprawdzamy czy przypadkiem jego sesja nie wygas\u0142a. W przypadku gdy wszystko jest OK zwracamy obiekt typu <span style=\"font-style: italic;\">UserDTO<\/span>,w przeciwnym razie zwracamy null.<\/p>\n<p>Podsumowuj\u0105c, uda\u0142o nam si\u0119 stworzy\u0107 mechanizm logowania. Jak na razie gotowa jest strona serwera.<br \/>\nW nast\u0119pnym wpisie poka\u017c\u0119 w jaki spos\u00f3b nale\u017cy wywo\u0142a\u0107 logowanie od strony klienta. Przedstawi\u0119 r\u00f3wnie\u017c pomys\u0142 w jaki spos\u00f3b zmienia\u0107 provider\u00f3w przez kt\u00f3re u\u017cytkownik ma si\u0119 logowa\u0107. Mo\u017ce to by\u0107 przydatne je\u017celi chcieliby\u015bmy logowa\u0107 si\u0119 np. poprzez inne serwisy jak Google, Facebook itp.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W dzisiejszym wpisie postaram si\u0119 przedstawi\u0107 moj\u0105 koncepcj\u0119 logowania do aplikacji Silverlightowej z wykorzystaniem MembershipProviders oraz w\u0142asnego AuthenticationService. Zacznijmy od stworzenia bazy danych, w kt\u00f3rej b\u0119dziemy przetrzymywa\u0107 informacje o u\u017cytkownikach &#8211; has\u0142a, role itp. Baz\u0119 danych stworzymy przy u\u017cyciu narz\u0119dzia aspnet_regsql.exe, kt\u00f3re to wygeneruje schemat bazy danych dostosowany do mo\u017cliwo\u015bci SqlMembershipProvider-a. aspnet_regsql.exe znajduje si\u0119 w [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,31,127,44],"tags":[251,255,256,190],"class_list":["post-58","post","type-post","status-publish","format-standard","hentry","category-authentication","category-authorization","category-membershipprovider","category-silverlight","tag-authentication","tag-authorization","tag-membershipprovider","tag-silverlight"],"_links":{"self":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/comments?post=58"}],"version-history":[{"count":5,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":477,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions\/477"}],"wp:attachment":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}