Udhibiti wa kuingia. Kompyuta za seva za kufanya kazi na akaunti za watumiaji

  • Mafunzo

Kusudi la somo: Soma mbinu ya uidhinishaji kupitia Cookie, matumizi ya sifa za kawaida za ufikiaji kwa kidhibiti na mbinu ya kidhibiti. Kwa kutumia IPrincipal. Kuunda moduli yako mwenyewe (IHttpModule) na IActionFilter yako mwenyewe.

Upungufu mdogo: Kwa kweli, katika asp.net mvc, vitabu vyote vya kiada vinapendekeza kutumia mfumo wa uidhinishaji ulioundwa tayari unaoitwa AspNetMembershipProvider, ilielezewa katika nakala http://habrahabr.ru/post/142711/ (ufikiaji sasa umefungwa), lakini alielezea hii ni kutoka kwa mtazamo wa "bonyeza na usielewi kilicho ndani." Nilipofahamiana na asp.net mvc, hii ilinichanganya. Zaidi ya hayo, katika makala hii http://habrahabr.ru/post/143024/ inasemekana kuwa huwezi kutumia mtoa huduma huyu. Na ninakubaliana na hili. Hapa, tunasoma kwa undani kila aina ya mbinu gumu za kiwango cha asp.net mvc, kwa hivyo hili ni moja wapo ya somo kuu.

Vidakuzi
Vidakuzi ni sehemu ya habari iliyotumwa na seva kwa kivinjari, ambayo kivinjari hurudi kwenye seva pamoja na kila ombi (karibu kila).

Seva inaandika kwenye kichwa cha majibu:
Set-Cookie: thamani[; inaisha=tarehe][; domain=kikoa][; njia=njia][; salama]
Kwa mfano:

HTTP/1.1 200 SAWA Aina ya maudhui: maandishi/html Set-Cookie: name=value Set-Cookie: name2=value2; Muda wake unaisha=Jumatano, 09-Juni-2021 10:18:14 GMT
Kivinjari (ikiwa kidakuzi hakijaisha muda wake) kwa kila ombi:
PATA /spec.html HTTP/1.1 Mpangishi: www.example.org Kidakuzi: jina=thamani; name2=value2 Kubali: */*

Weka kidakuzi (/Areas/Default/Controllers/HomeController.cs):
public ActionResult Index() ( var cookie = new HttpCookie() ( Name ="test_cookie", Value = DateTime.Now.ToString("dd.MM.yyyy"), Expires = DateTime.Now.AddMinutes(10), ); Response.SetCookie(cookie); rudisha View(); )

Katika Chrome tunaangalia usakinishaji:

Ili kupokea vidakuzi:
var cookie = Ombi.Vidakuzi["test_cookie"];

Wacha tufanye kikomo na tuangalie:

Kumbuka: Unaweza kujifunza zaidi kuhusu vidakuzi kwenye kiungo kifuatacho:
http://www.nczonline.net/blog/2009/05/05/http-cookies-explained/

Uidhinishaji
Kwa upande wetu, idhini itategemea matumizi ya vidakuzi. Ili kufanya hivyo, hebu tujifunze masharti yafuatayo:
  • Tiketi ya Uthibitishaji wa Fomu- tutatumia darasa hili kuhifadhi data ya idhini katika fomu iliyosimbwa
  • Tunahitaji kutekeleza kiolesura Mkuu wa shule na uweke HttpContext.User ili kuangalia majukumu na kiolesura cha IIdentity.
  • Kwa interface II utambulisho fanya utekelezaji
  • Pato kwa Mdhibiti wa Msingi kwa mali Mtumiaji wa Sasa thamani ya mtumiaji ambaye kwa sasa ameingia.

Tuanze.
Hebu tuunde kiolesura cha Uthibitishaji wa IAuthentication na utekelezaji wake Uthibitishaji Kimila (/Global/Auth/IAuthentication.cs):

Uthibitishaji wa kiolesura cha umma ( ///

/// Muktadha (hapa tunapata ufikiaji wa ombi na vidakuzi) /// HttpContext HttpContext ( pata; weka; ) Kuingia kwa Mtumiaji(kuingia kwa kamba, nenosiri la kamba, bool isPersistent); Kuingia kwa Mtumiaji(kuingia kwa kamba); utupu Login(); IPrincipal CurrentUser(pata;))

Utekelezaji (/Global/Auth/CustomAuthentication.cs):
Uthibitishaji wa Kibinafsi wa darasa la umma: Uthibitishaji wa IAuthentication ( binafsi tuli NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); const string ya faragha cookieName = "__AUTH_COOKIE"; HttpContext HttpContext ( get; set; ) public IRepository Repository; ) Kuingia kwa Mtumiaji kwa Wajumbe wa IAuthentication hadharani(string userName, string Password, bool isPersistent) ( User retUser = Repository.Login(userName, Password); ikiwa (retUser != null) ( CreateCookie(userName, isPersistent); ) rudisha retUser; ) public User Ingia(string userName) ( User retUser = Repository.Users.FirstOrDefault(p => string.Compare(p.Email, userName, true) == 0); ikiwa (retUser != null) ( CreateCookie(userName); ) rudisha retUser; ) utupu wa faragha CreateCookie(string userName, bool isPersistent = false) ( var ticket = new FormsAuthenticationTicket (1, userName, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), isPersistent, string.EmptyCommission, Forms.Ad ); // Simba tikiti kwa njia fiche. var encTicket = FormsAuthentication.Encrypt(tiketi); // Unda kuki. var AuthCookie = new HttpCookie(cookieName) ( Thamani = encTicket, Inaisha Muda = DateTime.Now.Add(FormsAuthentication.Timeout) ); HttpContext.Response.Cookies.Set(AuthCookie); ) utupu wa umma LogOut() ( var httpCookie = HttpContext.Response.Cookies; ikiwa (httpCookie != null) ( httpCookie.Value = string.Empty; ) ) IPrincipal ya faragha _currentUser; IPrincipal CurrentUser ya umma ( pata ( ikiwa (_currentUser == null) ( jaribu ( HttpCookie authCookie = HttpContext.Request.Cookies.Get(cookieName); ikiwa (authCookie != null && !string.IsNullOrEmpty(valuthCookie) (valuthCookie). = FormsAuthentication.Decrypt(authCookie.Value); _currentUser = new UserProvider(ticket.Name, Repository); ) vinginevyo ( _currentUser = new UserProvider(null, null); ) ) kamata (Isipokuwacha) ( logger.Error("Uthibitishaji umeshindwa : " + ex.Message); _currentUser = new UserProvider(null, null); ) ) return _currentUser; ) ) #endregion )

Jambo la msingi ni hili: tunapoanzisha ombi, tunafikia HttpContext.Request.Cookies na kuanzisha UserProvider:

Tikiti ya Var = FormsAuthentication.Decrypt(authCookie.Value); _currentUser = new UserProvider(ticket.Name, Repository);

Kwa uidhinishaji katika IRepository, mbinu mpya ya IRepository.Login imeongezwa. Utekelezaji katika SqlRepository:
public User Ingia(barua pepe ya kamba, nenosiri la kamba) ( rudisha Db.Users.FirstOrDefault(p => string.Compare(p.Email, email, true) == 0 && p.Password == password); )

UserProvider hutekelezea kiolesura cha IPrincipal (ambacho kina ukaguzi wa jukumu na ufikiaji wa IIdentity).
Zingatia darasa la UserProvider (/Global/Auth/UserProvider.cs):

Umma UserProvider: IPrincipal ( private UserIdentity userIdentity ( get; set; ) #region IPrincipal Members public IIdentity Identity ( get ( return userIdentity; ) ) public bool IsInRole(string role) ( if (userIdentity.User == null) ( rudisha uongo ; ) return userIdentity.User.InRoles(jukumu); ) #endregion public UserProvider(jina la kamba, hazina ya IRepository) ( userIdentity = new UserIdentity(); userIdentity.Init(jina, hazina); ) mfuatano wa kubatilisha umma ToString() ( rudisha userIdentity.Name;)

UserProvider wetu anajua kwamba darasa lake la IIdentity ni UserIdentity , na kwa hivyo anajua kuhusu darasa la Mtumiaji, ambalo ndani yake tunatekeleza InRoles(jukumu) mbinu:

Public bool InRoles(majukumu ya kamba) ( ikiwa (string.IsNullOrWhiteSpace(majukumu)) ( return false; ) var rolesArray = roles.Split(mpya ( "," ), StringSplitOptions.RemoveEmptyEntries); foreach (var jukumu katika rolesArray) ( var hasRole = UserRoles.Any(p => string.Compare(p.Role.Code, role, true) == 0); ikiwa (hasRole) ( return true; ) ) rudisha sivyo; )

Katika mbinu ya InRoles, tunatarajia ombi la kuja kuhusu majukumu ambayo yanaruhusiwa kwa rasilimali, yakitenganishwa na koma. Hiyo ni, kwa mfano, "admin, msimamizi, mhariri", ikiwa Mtumiaji wetu ana angalau moja ya majukumu, basi tunarudi thamani "kweli" (kuna upatikanaji). Tunalinganisha kwa uga wa Role.Code, sio Role.Name.
Zingatia darasa la Utambulisho wa Mtumiaji (/Global/Auth/UserIdentity.cs):
public class UserIdentity: IIdentity ( public User User ( get; set; ) public string AuthenticationType ( get ( return typeof(User).ToString(); ) ) public bool IsAuthenticated ( get ( return User != null; ) ) Jina la kamba ya umma ( pata ( kama (Mtumiaji != null) ( rudisha Mtumiaji.Email; ) //else rudisha bila kujulikana "anonym"; ) ) utupu wa umma Init(barua pepe ya kamba, hazina ya IRepository) ( ikiwa (!string.IsNullOrEmpty(barua pepe)) ( Mtumiaji = repository.GetUser(email); ) ) )
Tunaongeza mbinu mpya GetUser(barua pepe) kwa IRepository. Utekelezaji wa SqlRepository.GetUser() (LessonProject.Model:/SqlRepository/User.cs):

Mtumiaji wa Umma GetUser(barua pepe ya kamba) ( rudisha Db.Users.FirstOrDefault(p => string.Compare(p.Email, email, true) == 0); )

Karibu kila kitu kiko tayari. Wacha tuonyeshe CurrentUser katika BaseController:
public IAuthentication Auth ( get; set; ) public User CurrentUser ( pata ( return ((UserIdentity)Auth.CurrentUser.Identity).Mtumiaji; ) )

Ndiyo, hii si sahihi sana, kwa kuwa kuna kifungo kikubwa kinachohusika. Kwa hivyo, hebu tufanye hivi, anzisha kiolesura kingine IUserProvider , ambayo tutahitaji Mtumiaji aliyeidhinishwa arudishwe kwetu:
interface ya umma IUserProvider ( Mtumiaji ( pata; weka; ) ) ... darasa la umma Utambulisho wa mtumiaji: IIdentity, IUserProvider ( ///

/// Mtumiaji wa sasa /// public User User ( get; set; ) ... public IAuthentication Auth ( get; set; ) public User CurrentUser ( get ( return ((IUserProvider)Auth.CurrentUser.Identity).Mtumiaji; ) )
Sasa hebu tujaribu kuianzisha yote.
Kwanza, hebu tuongeze IAuthentication + CustomAuthentication kwenye usajili wa Ninject (/App_Start/NinjectWebCommon.cs):

Kernel.Funga ().Kwa ().InRequestScope();

Kisha tutaunda moduli ambayo itafanya kitendo cha uidhinishaji kwenye tukio la AuthenticateRequest:
public class AuthHttpModule: IHttpModule ( public void Init(muktadha wa HttpApplication) ( context.AuthenticateRequest += new EventHandler(this.Authenticate); ) utupu wa faragha Thibitisha(Object source, EventArgs e) ( HttpApplication app = (HttpApplication) Muktadha = (HttpApplication) Muktadha app.Context;var auth = DependencyResolver.Current.GetService (); auth.HttpContext = muktadha; muktadha.Mtumiaji = auth.Mtumiaji wa sasa; ) utupu wa umma Tupa() ( ) )

Chumvi yote iko kwenye mistari: auth.HttpContext = context na context.User = auth.CurrentUser . Mara tu moduli yetu ya uidhinishaji inapojifunza kuhusu muktadha na vidakuzi vilivyomo, inapata ufikiaji wa jina mara moja, ikitumia, inapokea data ya mtumiaji kwenye hazina na kuirudisha kwa BaseController. Lakini sio kila kitu mara moja, lakini kwa mahitaji.
Tunaunganisha moduli katika Web.config:

Mpango ni:

  • Hapo juu tunaonyesha ikiwa mtumiaji ameidhinishwa au la. Ikiwa imeidhinishwa, basi barua pepe yake na kiungo cha kuondoka, ikiwa sio, basi viungo vya kuingia na kujiandikisha
  • Kuunda fomu ya kuingia
  • Ikiwa mtumiaji aliingia data kwa usahihi, tunaidhinisha na kumtuma kwa ukurasa kuu
  • Mtumiaji akitoka nje, basi tunaua idhini yake

Nenda. Ongeza Html.Action("UserLogin", "Nyumbani") - huu ni mwonekano wa sehemu (yaani kipande cha msimbo ambacho hakina Mpangilio) - i.e. huonyeshwa mahali ambapo imesajiliwa, na si katika RenderBody().
_Layout.cshtml (/Areas/Default/Views/Shared/_Layout.cshtml):

@RenderBody() HomeController.cs: public ActionResult UserLogin() ( return View(CurrentUser); )

UserLogin.cshtml (/Areas/Default/Views/Home/UserLogin.cshtml):

@model LessonProject.Model.Mtumiaji @if (Model != null) (

  • @Model.Email
  • @Html.ActionLink("Toka", "Toka", "Ingia")
  • ) mwingine (
  • @Html.ActionLink("Ingia", "Faharasa", "Ingia")
  • @Html.ActionLink("Usajili", "Register", "Mtumiaji")
  • }

    Kidhibiti cha Kuingia/Kidhibiti cha Pato (/Areas/Default/Controllers/LoginController.cs):

    Kidhibiti cha Kuingia cha darasa la umma: DefaultController ( Fahirisi ya ActionResult ya umma () ( rudisha Mwonekano(Mtazamo mpya wa Login()); ) Fahirisi ya ActionResult ya umma(LoginView loginView) ( ikiwa (ModelState.IsValid) ( var user = Auth.Login(loginView.Email, loginView. Nenosiri, kuingiaView.IsPersistent); ikiwa (mtumiaji != null) ( rudisha RedirectToAction("Index", "Home"); ) ModelState["Nenosiri"].Errors.Ongeza("Nenosiri hazilingani"); ) rudisha Mwonekano ( loginView); ) ActionResult ya umma Logout() ( Auth.LogOut(); rudisha RedirectToAction("Index", "Home"); ) )

    LoginView.cs (/Models/ViewModels/LoginView.cs):
    darasa la umma LoginView ( Barua pepe ya kamba ya umma ( pata; weka; ) Nenosiri la kamba ya umma ( pata; weka; ) bool ya umma IsPersistent ( pata; weka; ) )

    Ukurasa wa kuingia Index.cshtml (/Areas/Default/Views/Index.cshtml):

    @model LessonProject.Models.ViewModels.LoginView @( ViewBag.Title = "Login"; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } !}

    Ingång

    @using (Html.BeginForm("Index", "Login", FormMethod.Post, mpya ( @class = "form-horizontal"))) (
    Ingång
    @Html.TextBox("Barua pepe", Model.Email, mpya ( @class = "input-xlarge"))

    Weka Barua Pepe

    @Html.ValidationMessage("Barua pepe")
    @Html.Password("Nenosiri", Model.Password, mpya ( @class = "input-xlarge" )) @Html.ValidationMessage("Nenosiri")
    }

    Wacha tukimbie na tuangalie:

    Vyanzo vyote viko

    Udhibiti wa kuingia

    Udhibiti wa Kuingia hurahisisha kuunda ukurasa wa kuingia kwa uthibitishaji wa fomu kwa kushirikiana na API ya Uanachama. Inatoa kiolesura kilicho tayari kutumia ambacho huuliza jina la mtumiaji na nenosiri na inatoa kitufe ili mtumiaji aingie. Nyuma ya pazia, inajumlisha utendakazi uliofafanuliwa katika kifungu kilichopita: kuthibitisha vitambulisho vya watumiaji kupitia API ya Uanachama na kujumuisha utendakazi wa uthibitishaji wa fomu za kimsingi, kama vile kuelekeza kwenye ukurasa ulioombwa awali katika eneo salama la programu baada ya kufaulu. Ingia.

    Hii inamaanisha kuwa Kuingia kunajumuisha vitu kama vile Membership.ValidateUser() au FormsAuthentication.RedirectFromLoginPage(), kwa hivyo sio lazima uandike msimbo huo wewe mwenyewe. Picha hapa chini inaonyesha kidhibiti cha Kuingia kikifanya kazi:

    Wakati wowote mtumiaji anapobofya kitufe cha Ingia, kidhibiti huthibitisha kiotomati jina la mtumiaji na nenosiri kwa kutumia kitendakazi cha Membership.ValidateUser(), na kisha kupiga simu FormsAuthenication.RedirectFromLoginPage() ikiwa uthibitishaji umefaulu. Chaguzi zote za kidhibiti cha Kuingia huathiri ingizo ambalo hutoa kwa njia hizi. Kwa mfano, ukiteua kisanduku cha kuteua Nikumbuke wakati ujao, itatuma kweli katika kigezo cha createPersistentCookie cha njia ya RedirectFromLoginPage(). Kwa hivyo, FormsAuthenticationModule huunda kidakuzi kinachoendelea.

    Nyuma ya pazia, Ingia ni udhibiti wa mchanganyiko wa ASP.NET. Inapanuliwa kikamilifu - kwa maana ya kwamba hukuruhusu kubatilisha mitindo na mali yoyote ya mpangilio, na pia kukatiza matukio yaliyotolewa ili kubatilisha tabia yake ya msingi. Ukiacha udhibiti ulivyo na usikatize matukio yoyote, itatumia kiotomatiki mtoa huduma wa uanachama aliyesanidiwa kwa ajili ya programu.

    Njia rahisi zaidi ya udhibiti wa Kuingia kwenye ukurasa inaonekana kama hii:

    Kuna mali kadhaa zinazopatikana ili kubadilisha mwonekano wa udhibiti wa Kuingia. Unaweza kutumia mipangilio ya mtindo tofauti kama inavyoonyeshwa hapa chini:

    Unaweza pia kutumia madarasa ya CSS kubinafsisha mwonekano wa Ingia. Kila sifa ya mtindo inayoungwa mkono na Kidhibiti cha Kuingia ni pamoja na mali ya CssClass. Kama ilivyo kwa udhibiti mwingine wowote wa ASP.NET, mali hii hukuruhusu kutaja jina darasa la CSS, ambayo hapo awali iliongezwa kwenye tovuti. Hebu tuchukulie kwamba laha ya mtindo ifuatayo ya CSS imeongezwa kwa mradi, kwa jina la faili MyStyles.css:

    MyLoginTextBoxStyle ( kielekezi: pointer; rangi ya usuli: njano; panga maandishi: katikati; padding:6px; mpaka: nyeusi iliyo na nukta; font-familia: Verdana; panga-wima: katikati; ) .Ingia ( onyesha:kizuizi cha mstarini; ) .Kichwa ( pedi: 6px; )

    Faili hii ya mtindo inaweza kujumuishwa katika ukurasa wa kuingia ili kuweza kuweka mtindo wa kipengele cha Kuingia:

    Jedwali lifuatalo linaorodhesha mitindo inayotumika na udhibiti wa Kuingia. Kila mtindo hufanya kazi kwa njia ile ile. Sifa za fonti na rangi zinaweza kuwekwa moja kwa moja, au unaweza kutumia kipengele cha CssClass kubainisha aina ya CSS inayotakiwa:

    Mitindo inayoungwa mkono na udhibiti wa Kuingia
    Mtindo Maelezo
    CheckBoxStyle

    Inafafanua sifa za mtindo kwa kisanduku tiki cha Nikumbuke wakati ujao.

    FailureStyle

    Inafafanua mtindo wa maandishi ambayo yanaonyeshwa wakati kuingia kumeshindwa.

    HyperLinkStyle

    Udhibiti wa Kuingia hukuruhusu kufafanua aina kadhaa za viungo, kama vile ukurasa wa kwanza wa usajili. Mtindo huu unabainisha kuonekana kwa viungo vile

    InstructionTextStyle

    Kidhibiti cha Kuingia hukuruhusu kubainisha maandishi ya usaidizi ambayo yanaonekana moja kwa moja ndani ya kidhibiti cha Kuingia. Mtindo huu unabainisha mwonekano wa maandishi haya

    LabelStyle

    Inafafanua mtindo wa lebo za Jina la Mtumiaji na Nenosiri.

    LoginButtonStyle

    Inafafanua mtindo wa kitufe cha kuingia

    TextBoxStyle

    Inafafanua mtindo wa sehemu za maandishi ya Jina la Mtumiaji na Nenosiri.

    TitleTextStyle

    Inafafanua mtindo wa maandishi ya kichwa kwa udhibiti wa Kuingia

    ValidatorTextStyle

    Inafafanua mitindo ya vidhibiti vinavyotumika kuthibitisha jina na nenosiri la mtumiaji

    Kiolesura cha mtumiaji wa kipengele cha Kuingia hakijabinafsishwa tu kupitia mitindo hii; Sifa zingine za ziada zinalenga sehemu mahususi za maudhui ya kidhibiti, kama vile kitufe cha Ingia, ambacho pia hukuruhusu kubinafsisha GUI.

    Kwa mfano, unaweza kuchagua maandishi yanayoonyeshwa kwenye kitufe cha kuingia, au hata uonyeshe kiungo badala ya kitufe hiki (kama kilivyowekwa kwa chaguomsingi). Zaidi ya hayo, unaweza kuongeza viungo vingi kwenye udhibiti wa Kuingia, kama vile kiungo cha ukurasa wa usaidizi au ukurasa wa usajili. Kurasa zote mbili zinapaswa kuwa wazi kwa ufikiaji usiojulikana, kwa kuwa usaidizi unapaswa kutolewa kwa watumiaji wasiojulikana (kumbuka kwamba ikiwa mtu ataona udhibiti wa Kuingia, basi kuna uwezekano. mtumiaji asiyejulikana) Ili kujumuisha viungo vya ziada katika Kuingia, rekebisha ufafanuzi ulioonyeshwa hapo awali kama ifuatavyo:

    ...

    Nambari hii husababisha viungo viwili vya ziada kuonyeshwa - kwa ukurasa wa usaidizi na kwa ukurasa wa kwanza wa usajili, na pia huongeza maandishi. maelekezo mafupi chini ya kichwa cha kipengele cha Kuingia:

    Mitindo iliyoelezwa hapo awali inatumika kwa sifa hizi pia. Jedwali hapa chini linaelezea sifa muhimu za kusanidi udhibiti wa Kuingia:

    Sifa Muhimu za Kubinafsisha Kidhibiti cha Kuingia
    Mali Maelezo
    Nakala ya ujumbe
    Nakala ya Kichwa

    Maandishi ya kuonyesha katika kichwa cha kidhibiti

    Maandishi ya Maagizo

    Sifa hii tayari imetumika katika kijisehemu cha awali cha msimbo. Ina maandishi yanayoonekana chini ya kichwa cha kidhibiti

    FailureText

    Maandishi yanaonyeshwa na Kidhibiti cha Kuingia ikiwa jaribio la kuingia litashindwa

    UserNameLabelText

    Maandishi yameonyeshwa kama lebo hapo awali uwanja wa maandishi jina la mtumiaji

    PasswordLabelText

    Maandishi yanaonyeshwa kama lebo kabla ya sehemu ya maandishi ya nenosiri la mtumiaji

    Jina la mtumiaji

    Thamani ya awali ya kujaza sehemu ya maandishi ya jina la mtumiaji

    Jina la mtumiajiRequiredErrorMessage

    Ujumbe wa hitilafu utaonyeshwa ikiwa mtumiaji hajaweka jina

    PasswordRequiredErrorMessage

    Ujumbe wa hitilafu unaonyeshwa ikiwa mtumiaji hajaingiza nenosiri

    Kitufe cha kuingia
    LoginButtonText

    Maandishi yanaonyeshwa kwenye kitufe cha kuingia

    LoginButtonType
    LoginButtonImageUrl

    Ikiwa kitufe cha kuingia kitawasilishwa kama picha ya mchoro, lazima ubainishe URL ambapo picha hiyo iko

    Ukurasa wa kuingia
    DestinationPageUrl

    Ikiwa jaribio la kuingia limefaulu, kidhibiti cha Kuingia huelekeza mtumiaji kwenye ukurasa huu. Kwa chaguo-msingi, sifa hii ni tupu. Ikiwa tupu, hutumia mfumo wa uthibitishaji wa fomu kuelekeza kwenye ukurasa asili ulioombwa au Url chaguo-msingi iliyosanidiwa katika web.config kwa uthibitishaji wa fomu.

    FailureAction

    Inafafanua hatua ambayo udhibiti huchukua baada ya jaribio lisilofanikiwa la kuingia. Chaguo mbili halali ni Onyesha upya na RedirectToLoginPage. Thamani ya kwanza husababisha ukurasa wa sasa pekee kuonyeshwa upya, huku ya pili inasababisha kuelekezwa upya kwa ukurasa wa kuingia uliosanidiwa. Chaguo la pili ni muhimu ikiwa kidhibiti cha Kuingia kinatumika mahali pengine isipokuwa kwenye ukurasa wa kuingia

    VisibleWhenLoggedIn

    Ikiwekwa kuwa sivyo, kidhibiti hujificha kiotomatiki ikiwa mtumiaji tayari ameingia. Ikiwekwa kuwa ndivyo (chaguo-msingi), kipengele cha Kuingia huonyeshwa hata kama mtumiaji ameingia

    Kuweka lebo ya "Nikumbuke".
    DisplayRememberMe

    Hukuruhusu kuonyesha au kuficha kisanduku tiki cha Nikumbuke wakati ujao. Kwa chaguo-msingi sifa hii imewekwa kuwa kweli

    RememberMeSet

    Hubainisha thamani chaguo-msingi ya kisanduku tiki cha Nikumbuke wakati ujao. Kwa chaguo-msingi, mali hii imewekwa kwa uongo, i.e. kisanduku cha kuteua hakijachaguliwa

    Ukurasa wa usajili
    CreateUserUrl

    Inafafanua kiungo kwenye ukurasa wa tovuti unaokuruhusu kuunda (kusajili) mtumiaji. Kwa hivyo hii kawaida hutumiwa kumruhusu mtumiaji ufikiaji wa ukurasa wa usajili wa awali. Kwa kawaida hii itaonyesha kidhibiti cha CreateUserWizard

    UndaNakala ya Mtumiaji
    CreateUserIconUrl

    URL picha ya mchoro, iliyoonyeshwa pamoja na maandishi ya kiunganishi cha CreateUserUrl

    Ukurasa wa usaidizi
    HelpPageUrl

    URL ya kuelekeza mtumiaji kwenye ukurasa wa usaidizi

    HelpPageText
    HelpPageIconUrl

    URL ya ikoni inayoonekana pamoja na maandishi ya kiungo cha HelpPageUrl

    Ukurasa wa kurejesha nenosiri
    PasswordRecoveryUrl

    URL ya kuelekeza mtumiaji upya kwa ukurasa wa kurejesha nenosiri. Ukurasa huu unatumiwa wakati mtumiaji amesahau nenosiri. Kwa kawaida huonyesha kidhibiti cha PasswordRecovery

    PasswordRecoveryText
    PasswordRecoveryIconUrl

    URL ya ikoni inayoonekana pamoja na maandishi ya kiungo PasswordRecoveryUrl

    Violezo na udhibiti wa Kuingia

    Kama unavyoona, sifa hizi zote hufanya udhibiti wa Kuingia uweze kubinafsishwa sana. Lakini kama ulivyogundua zaidi, haiwezekani kufafanua usemi wowote ili kuangalia uhalali wa ingizo. Bila shaka, inawezekana kutekeleza uthibitishaji wa upande wa seva ndani ya taratibu za tukio zinazotolewa na udhibiti wa Kuingia. Wakati unahitaji kuongeza baadhi ya vipengele kipengele cha kipengele Udhibiti wa kuingia, hii haiwezi kufanywa kupitia mali iliyotolewa hapo juu. Kwa mfano, vipi ikiwa unahitaji sehemu ya pili ya maandishi kwa uthibitishaji thabiti na nenosiri la pili au nenosiri maalum, kama baadhi ya tovuti za serikali hufanya?

    Kwa bahati nzuri, kama vidhibiti vingine kama vile GridView, kipengele cha Kuingia kinaweza kutumia violezo. Violezo hukuruhusu kubinafsisha yaliyomo kwenye udhibiti wa Kuingia bila vizuizi vyovyote. Unaweza kuongeza vidhibiti vyovyote vipya kwake. Hutumia kiolezo maalum kwa udhibiti wa Kuingia kwa kutumia mpini LayoutTemplate:

    Weka sahihi

    Jina la mtumiaji:
    Nenosiri:


    Ukiangalia nambari iliyo hapo juu, swali moja linatokea: ikiwa kubinafsisha kiolezo kunahusisha kuandika msimbo mwingi wa UI (au kuusanifu kwa mbuni wa kuona), kwa nini usiandike ukurasa wako wa kuingia bila kutumia Kidhibiti cha Kuingia?

    Hili ni swali halali. Walakini, kama ilivyoelezewa hapo awali, mwisho wa mbele ni sehemu moja tu ya kitu cha Kuingia. Kwa mfano, mtumiaji anapobofya kitufe cha kuingia, kidhibiti cha Kuingia tayari kina msimbo wote unaohitajika ili kuthibitisha kiotomatiki mtumiaji dhidi ya duka la wanachama na kuelekeza mtumiaji kwenye ukurasa asili alioomba kupitia miundomsingi ya uthibitishaji wa fomu. Kwa hivyo hakika umeepushwa na shida ya kuandika nambari hii.

    Ukiwa na vidhibiti sahihi na thamani sahihi za kitambulisho kwa vidhibiti hivyo, hutahitaji kuandika msimbo wa kushughulikia tukio. Nambari hiyo inafanya kazi kama kawaida, isipokuwa kwamba unafafanua seti ya vidhibiti na mpangilio wao. Kwa kweli, udhibiti wa Kuingia unahitaji angalau sehemu mbili za maandishi zilizo na vitambulisho vya Jina la mtumiaji na Nenosiri. Ikiwa sehemu hizi mbili za maandishi hazipo (au zina thamani tofauti za kitambulisho), basi Kuingia kutatupa ubaguzi. Vidhibiti vingine vyote ni vya hiari, lakini ukitoa thamani inayofaa ya kitambulisho (kama vile Ingia ili upate kitufe cha kuingia), basi Ingia itashughulikia matukio yao kiotomatiki, na kufanya kana kwamba mpangilio chaguomsingi ulitumika.

    Jedwali hapa chini linaorodhesha thamani maalum za vitambulisho, aina za vipengele vinavyohitajika kwao, na bendera ya mahitaji:

    Udhibiti wa Kuingia unaweza kuwa udhibiti wowote unaoauni utepetevu wa tukio na sifa ya CommandName. Ni muhimu kuweka mali ya CommandName ya kipengele hiki Ingia, kwa sababu vinginevyo, kidhibiti cha Kuingia hakitaitambua wakati wa kuchakata tukio. Ikiwa hutaongeza kidhibiti kwa kutumia kipengele cha CommandName kilichowekwa kwa Ingia, itabidi ushughulikie matukio wewe mwenyewe na uandike msimbo unaofaa ili kuthibitisha jina la mtumiaji na nenosiri na uelekeze upya kwa ukurasa asili ulioombwa.

    Unaweza pia kuongeza vidhibiti na vitambulishi vingine ambavyo havihusiani na Ingia hata kidogo. Msimbo ulioonyeshwa hapo juu ulitumia kipengele cha RequiredFieldValidator na RegularExpressionValidator ili kuthibitisha sehemu za jina la mtumiaji na nenosiri.

    Unapotumia LayoutTemplate, sifa nyingi asilia kwenye udhibiti hazipatikani tena. Wakati kiolezo kinatumika, ni sifa zifuatazo pekee zinazobaki zinapatikana:

      DestinationPageUrl

      VisibleWhenLoggedIn

    • Mtoaji wa Uanachama

    Sifa zote za mtindo na vipengele kadhaa vya mipangilio ya maandishi ya vipengele chaguomsingi hazipatikani tena katika Kihariri cha Sifa za Studio inayoonekana kwa sababu zinaweza kuongezwa mwenyewe kama vidhibiti vya mtu binafsi au kama maandishi tuli kwenye kiolezo cha kipengele cha Kuingia. Ukiziongeza kwenye kipengele cha Kuingia katika hali ya kiolezo, zitapuuzwa kwa sababu kiolezo hubatilisha kiolesura chaguo-msingi cha kipengele cha Kuingia, ambacho kinatumia sifa hizi.

    Kupanga Udhibiti wa Kuingia

    Kidhibiti cha Kuingia kinaweza kutumia matukio na sifa kadhaa ambazo unaweza kutumia kubinafsisha tabia yake. Hutoa udhibiti kamili juu ya kupanga vizuri udhibiti wa Kuingia (pamoja na zana zingine za kubinafsisha kama vile violezo na sifa za mitindo). Udhibiti wa Kuingia unaauni matukio yaliyoorodheshwa kwenye jedwali hapa chini:

    Matukio ya Kudhibiti Kuingia
    Tukio Maelezo
    Kuingia

    Imeanzishwa kabla tu ya udhibiti kumthibitisha mtumiaji

    Umeingia

    Imeanzishwa baada ya mtumiaji kuthibitishwa na kidhibiti

    Hitilafu ya Kuingia

    Huanzishwa wakati jaribio la kuingia la mtumiaji linaposhindikana kwa sababu fulani (kama vile nenosiri lisilo sahihi au jina la mtumiaji)

    Thibitisha

    Imeanzishwa ili kuthibitisha mtumiaji. Ukishughulikia tukio hili, lazima uthibitishe mtumiaji mwenyewe, na udhibiti wa Kuingia utategemea kabisa nambari yako ya uthibitishaji.

    Matukio matatu ya kwanza yanaweza kushughulikiwa ili kutekeleza kitendo fulani kabla ya mtumiaji kuthibitishwa, baada ya mtumiaji kuthibitishwa, na ikiwa hitilafu itatokea wakati wa uthibitishaji. Kwa mfano, tukio la LoginError linaweza kutumika kuelekeza mtumiaji kiotomatiki kwenye ukurasa wa kurejesha nenosiri baada ya idadi fulani ya majaribio ya kuingia, kama inavyoonyeshwa hapa chini:

    Utupu uliolindwa Page_Load(object mtumaji, EventArgs e) ( if (!this.IsPostBack) ViewState["LoginErrors"] = 0; ) utupu uliolindwa Login1_LoginError(object sender, EventArgs e) ( // Ikiwa hali ya LoginErrors haipo, unda ikiwa (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; //Ongeza kihesabu cha majaribio yaliyoshindwa ya kuingia int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["LoginErrors "] = ErrorCount ; // Angalia idadi ya majaribio ambayo hayakufaulu ikiwa (((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl);)

    Udhibiti wa Kuingia hutengeneza matukio kwa mpangilio ulioonyeshwa kwenye takwimu hapa chini:

    Kama ilivyoelezwa hapo awali, ikiwa utaingilia tukio la Thibitisha, lazima uongeze jina lako la mtumiaji na msimbo wa uthibitishaji wa nenosiri. Mali Thibitisha inasaidia mfano wa orodha ya vigezo vya AuthenticateEventArgs. Darasa hili la hoja ya tukio linaauni mali moja inayoitwa Imethibitishwa. Ikiwekwa kuwa ndivyo, kidhibiti cha Kuingia kinachukulia kuwa uthibitishaji ulifanikiwa na kuzima tukio la LoggedIn. Ukiweka sifa hii kuwa sivyo, FailureText itaonyeshwa na tukio la LoginError litaonyeshwa:

    Ingia batili iliyolindwa1_Authenticate(object mtumaji, AuthenticateEventArgs e) ( ikiwa (Membership.ValidateUser(Login1.UserName, Login1.Password)) ( e.Authenticated = true; ) vinginevyo ( e.Authenticated = uongo; ) )

    Kama unaweza kuona, kuna ufikiaji wa moja kwa moja kwa maadili yaliyoingizwa kupitia Jina la mtumiaji na sifa za Nenosiri, ambazo zina maandishi yaliyoingizwa kwenye uwanja wa maandishi unaolingana. Ikiwa unatumia vidhibiti vya violezo na unataka kupata thamani kutoka kwa kipengele kingine pamoja na vipengele vya Jina la mtumiaji na Nenosiri, unaweza kutumia njia ya FindControl() kupata kipengele hicho cha ziada. Njia hii huchukua kitambulisho cha kipengele kinachohitajika na kurejesha mfano wa System.Web.UI.Control. Kitu kinachotokana hutupwa kwa aina ya udhibiti unaohitajika na thamani inayohitajika na mbinu maalum ya uthibitishaji wa kitambulisho cha mtumiaji inasomwa.

    Wacha sasa tuendelee kuelezea mchakato wa uthibitishaji moja kwa moja ndani ya mazingira ya ASP.NET, ambapo aina 3 za uthibitishaji hutolewa kwa chaguo lako:

    * Uthibitishaji wa Windows
    * Umbo
    * Pasipoti

    Uthibitishaji wa Windows:

    Kama jina linavyopendekeza, njia hii inategemea matumizi ya akaunti za Windows. Njia hii inafaa ikiwa unaunda programu kwa mtandao wa ndani, na akaunti zote halali na vikundi huhifadhiwa kwenye kikoa kilichoainishwa. Hata hivyo, unahitaji kuwa mwangalifu sana wakati wa kugawa haki za ufikiaji kwa watumiaji, kwani pia unapeana haki za kufanya kazi katika Windows. Ili kusanidi ASP.NET kufanya kazi katika hali ya uthibitishaji wa Windows, unahitaji kubadilisha faili ya usanidi wa mradi wa Wavuti Web.config au, ikiwa ni lazima, faili ya usanidi ya seva nzima, iliyoko WINDOWS_FOLDERMicrosoft.NET

    Toleo la Framework.NETCONFIGMachine.config. Katika mfano wetu, tutafanya kazi pekee na faili ya mradi - Web.config, ambayo unahitaji kupata sehemu ya uthibitishaji na kuweka sifa ya hali yake kwa Windows:

    Sasa unaweza kuendelea moja kwa moja kwenye programu na kutekeleza uthibitishaji wa msingi wa Windows. Ili kukusaidia, darasa la WindowsIdentity limeundwa mahsusi kwa kufanya kazi na uthibitishaji wa Windows. Kwa ujumla, kwa uthibitishaji wa msingi wa Windows, kuna madarasa mawili kuu yaliyotolewa na NET Framework:

    * Utambulisho wa Jumla - hutekeleza kiolesura cha IIdentity pekee na hairejelei aina yoyote mahususi ya uthibitishaji
    * WindowsIdentity - pia ni utekelezaji wa kiolesura cha IIdentity, lakini pia inajumuisha njia maalum kwa uthibitishaji wa msingi wa Windows.

    Jina la mtumiaji na jina la kikundi huhifadhiwa katika kitu cha WindowsIdentity katika umbizo lifuatalo: DOMAINUserName na DOMAINGroup, mtawalia. Vighairi pekee ni vikundi vilivyojumuishwa, kwa mfano kikundi cha Wasimamizi; ili kuipata unaweza kutumia kamba ya unganisho kupitia WindowsIdentity: BUILTINAadministrators. Au unaweza kubainisha kikundi kilichojengewa ndani kutoka kwa hesabu ya System.Security.Principal.WindowsBuiltInRole.

    Kutoka Mtini. 1 inaonyesha kuwa kitu cha WindowsIdentity hukuruhusu kupata jina la mtumiaji; kuamua aina ya uthibitishaji; kuamua ikiwa uthibitishaji ulifanywa bila kujulikana; Unaweza pia kujua ikiwa mtumiaji amepitisha uthibitishaji au la, iwe ni mgeni au mtumiaji wa mfumo.


    Mchele. 1 - Kitu cha WindowsIdentity

    Kwa sababu katika programu za ASP.NET, kufikia kitu cha WindowsIdentity, utahitaji kuunda mnyororo ufuatao:

    HttpContext.Current.User.Identity, basi unaweza pia kuamua ni jukumu gani mtumiaji wa sasa anahusika. Hii inaweza kupatikana kwa sababu ya ukweli kwamba mali ya Mtumiaji katika mnyororo huu hutumia kiolesura cha Msingi, ambacho hukuruhusu kuamua ikiwa mtumiaji ni wa jukumu maalum kwa kupiga kazi ya IsInRole, ambayo ina syntax ifuatayo:

    Kazi ya Umma Inayoweza Kubatilika IsInRole(Jukumu la ByVal Kama Mfuatano) Kama Mwanachama wa Boolean wa: System.Security.Principal.Mkuu.

    Lakini wacha tuondoke kwenye nadharia tupu kwa muda na jaribu kutekeleza mfano wa vitendo. Ili kufanya hivyo, tengeneza mradi mpya Maombi ya Wavuti ya ASP.NET na uweke nambari ifuatayo:
    Default.aspx:

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="AuthSample.WebForm1"%> Sampuli ya Uthibitishaji Visual Msingi.NET 7.1">



    Default.aspx.vb:

    Daraja la Wavuti la Umma1 Linarithi Mfumo.Web.UI.Ukurasa #Mkoa “ Msimbo Uliotolewa wa Mbuni wa Fomu ya Wavuti “ ‘Simu hii inahitajika na Mbuni wa Fomu ya Wavuti. Ndogo ya Kibinafsi ya KuanzishaComponent() Maliza Ndogo 'KUMBUKA: Tamko la kishikilia nafasi lifuatalo linahitajika na Mbuni wa Fomu ya Wavuti. ‘Usiifute au kuihamisha. Tamko la Muundaji wa Kishika Nafasi Kama System.Object Private Sub Page_Init(ByVal Sender As System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Init 'CODEGEN: Simu hii ya mbinu inahitajika na Mbunifu wa Fomu ya Wavuti 'Usiirekebishe kwa kutumia kihariri cha msimbo. . InitializeComponent() Maliza Kipengele kidogo cha #Mkoa_Mzigo wa Kibinafsi(ByVal mtumaji Kama System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Load Dim s As String s = "

    Jina:" & HttpContext.Current.User.Identity.Name &"

    ” & _ “

    Aina ya uthibitishaji:" & HttpContext.Current.User.Identity.AuthenticationType.ToString &"

    ” & _ “

    Imethibitishwa:" & HttpContext.Current.User.Identity.IsAuthenticated.ToString &"

    ” & _ “

    Ni admin:“ & HttpContext.Current.User.IsInRole(“Msimamizi”).ToString & “

    ” Majibu.Andika (ma) Mwisho Darasa Ndogo

    Ikiwa hali ya uthibitishaji wa Windows ilichaguliwa na mipangilio ya IIS haikusababisha migogoro yoyote, basi utapokea taarifa sahihi kuhusu mtumiaji wako wa sasa. Ikiwa jina la mtumiaji na sehemu za aina ya uthibitishaji ni tupu, basi unahitaji tu kusanidi IIS, kufanya hivi fuata hatua hizi:

    1. Fungua IIS na utafute saraka pepe na programu tumizi hii
    2. Fungua dirisha la mali kwa saraka hii na uende kwenye kichupo cha Usalama wa Saraka. Katika fremu ya Ufikiaji na Uthibitishaji Isiyojulikana, bofya Hariri...
    3. Katika dirisha inayoonekana (Mchoro 2), usiondoe kisanduku cha ufikiaji usiojulikana


    Mchele. 2 - Kuanzisha IIS

    Hii inahitimisha mjadala wetu wa uthibitishaji unaotegemea Windows na kuendelea kuunda uthibitishaji.

    Uthibitishaji wa fomu:

    Uthibitishaji wa fomu, au uthibitishaji wa msingi wa kuki kama unavyoitwa pia, una faida kadhaa juu ya uthibitishaji wa Windows.

    * Kwanza, una fursa ya kuamua kuonekana kwa fomu ya usajili kwa ladha yako mwenyewe na rangi au kwa ladha na rangi ya mtumiaji badala ya aina moja ya dirisha la usajili la Windows.
    * Pili, una udhibiti kamili juu ya habari unayoingiza
    * Maelezo ya mtumiaji sasa yanaweza kuhifadhiwa sio tu katika SAM au Saraka Inayotumika, lakini pia katika hifadhi nyingine yoyote, hasa: hifadhidata, saraka ya LDAP, faili za XML au faili ya maandishi wazi.
    * Hakuna haja ya kuunganisha sera ya usalama ya seva na sera ya maombi ya Wavuti, kwa kuwa, kama ilivyotajwa hapo awali, maelezo yote ya mtumiaji yanaweza kuwekwa kwenye hifadhi tofauti ya data bila mwingiliano wowote na akaunti za OS.

    Lakini licha ya wingi huu wa chaguo za uthibitishaji kulingana na fomu, kuna kizuizi kimoja kikubwa - lazima mtumiaji aruhusu matumizi ya vidakuzi. Ikiwa haipo, basi uthibitishaji wa fomu kwa kutumia zana za ASP.NET haitafanya kazi. Makini na maneno "... kwa kutumia zana za ASP.NET ...". Hii ina maana kwamba utaratibu unaoondoa msanidi programu kutoka kwa shughuli za kawaida za ukaguzi usio na mwisho hautafanya kazi, kwa maneno mengine, maombi yote yaliyopokelewa kutoka kwa mtumiaji ambaye bado hajaidhinishwa yanaelekezwa kwenye ukurasa wa usajili, ambapo anaingiza taarifa muhimu ( kawaida jina la mtumiaji na nywila) . Taarifa iliyopokelewa huhamishiwa kwenye mazingira ya ASP.NET, ambapo inathibitishwa. Ikifaulu, mtumiaji hutumwa kidakuzi ambacho kina tikiti ya Uidhinishaji, jina la mtumiaji na ufunguo wa kupata kitambulisho baadaye. Matokeo yake, maombi yote ya kivinjari yanayofuata yatakuwa na taarifa za uidhinishaji katika vichwa, ambazo hutumwa kwa mazingira ya ASP.NET kwa uthibitishaji. Kwa hivyo, ikiwa mtumiaji haungi mkono vidakuzi, basi ukaguzi wote kuhusu ikiwa amepitisha uthibitishaji utahitaji kufanywa kwa mikono, kwa mfano, katika matoleo ya awali ya ASP, hii ilifanywa kwa kutumia kitu cha Kikao, takriban katika fomu ifuatayo:

    Ikiwa Sio Kikao("Kimesajiliwa") = "1" Kisha Jibu.Elekeza("login.asp") Maliza Iwapo

    Ili kutumia uthibitishaji wa fomu, kwanza unahitaji kusanidi usanidi wa mradi wa Wavuti. Ili kufanya hivyo, badilisha yaliyomo kwenye lebo Web.config faili kama ifuatavyo:

    Wacha tuangalie kwa karibu nambari iliyo hapo juu. Sifa ya hali ya lebo inafafanua mbinu ya uthibitishaji. Katika mifano ya awali tulitumia thamani ya Windows, ambayo ilisanidi uthibitishaji kwa hali ya uthibitishaji wa Windows, sasa kwa kazi ya msingi wa fomu tunatumia hali ya Fomu. Mbali na vipengele hivi viwili, kuna 2 zaidi: Pasipoti na Hakuna - wa kwanza wao anafafanua uthibitishaji wa pasipoti, ambayo itajadiliwa baadaye, ya pili inazima kabisa. Lebo inayofuata ( ) ni ya kipekee kwa uthibitishaji kulingana na fomu na inajumuisha maelezo yafuatayo:

    * jina - jina la faili ya kuki ambayo data juu ya uthibitishaji wa mafanikio itaingizwa
    * loginUrl - inafafanua anwani ya ukurasa ambayo mtumiaji ataelekezwa kujiandikisha
    * ulinzi - hukubali thamani zote|Hakuna|Usimbaji fiche|Uthibitishaji na huamua jinsi data katika vidakuzi inalindwa. Kutoka kwa maadili yanayokubalika ni wazi kuwa huwezi kufanya chochote na data iliyopokelewa na kuikubali kama ilivyo; unaweza kuzilinganisha; inaweza kusimbwa; na pia inawezekana kuchanganya uthibitishaji na cryptography - thamani hii hutumiwa kwa default.
    * muda umeisha - hufafanua kipindi cha muda katika sekunde ambapo kidakuzi kitapatikana
    * njia - sifa hii inabainisha njia kamili ya kuki. Kwa chaguo-msingi, ina kufyeka mbele (/), ambayo hupanua njia zote. Kubadilisha mpangilio huu hakupendekezwi kwa sababu baadhi ya vivinjari ni nyeti kwa ukubwa katika njia, kwa hivyo kubadilisha mpangilio huu kunaweza kuzuia baadhi ya watumiaji kuweza kuthibitisha.
    * inahitajiSSL - sifa hii inachukua thamani ya Kweli au Siyo (kwa chaguomsingi) na kuweka hitaji la kutumia itifaki ya soketi salama (SSL - Safu ya Soketi Zilizolindwa)
    * slidingExpiration - Huonyesha kama kidakuzi na vitambulisho vinahitaji kutengenezwa upya ikiwa muda wa kuisha utaisha. Inakubali maadili ya kweli (chaguo-msingi) au sivyo.

    Sifa zote zinazowezekana za sehemu ya fomu zilielezewa hapo juu, lakini kwa operesheni sahihi Programu inahitaji tu kutumia 3 kati yao, kama inavyoonyeshwa kwenye orodha ifuatayo:

    Uthibitishaji wa fomu kwa kutumia faili tofauti za XML:

    Hebu sasa tuunde ukurasa rahisi wa usajili wa mtumiaji unaokagua jina la mtumiaji na nenosiri lililowekwa dhidi ya faili ya XML. Ili kufanya hivyo, kwanza unda faili ya XML inayoitwa users.xml sawa na ifuatayo:
    users.xml:

    Yohana moja Mike mbili Bill tatu

    Msingi wa mtumiaji uko tayari - sasa unaweza kuanza kuunda mradi wa usajili wa watumiaji wa majaribio. Nambari zote zinazohitajika zimepewa hapa chini:
    Default.aspx:

    <%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”default.aspx.vb” Inherits=”FormAuth._default”%> chaguo-msingi



    Default.aspx.vb:

    Inaagiza Mfumo.Web.Security Public Class _default Herits System.Web.UI.Page #Region " Msimbo Uliotolewa wa Muundaji wa Fomu ya Wavuti " 'Simu hii inahitajika na Mbuni wa Fomu ya Wavuti. Ndogo ya Kibinafsi ya KuanzishaComponent() Maliza Ndogo 'KUMBUKA: Tamko la kishikilia nafasi lifuatalo linahitajika na Mbuni wa Fomu ya Wavuti. ‘Usiifute au kuihamisha. Tamko la Muundaji wa Kishika Nafasi Kama System.Object Private Sub Page_Init(ByVal Sender As System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Init 'CODEGEN: Simu hii ya mbinu inahitajika na Mbunifu wa Fomu ya Wavuti 'Usiirekebishe kwa kutumia kihariri cha msimbo. . InitializeComponent() Maliza Kipengele kidogo cha #Mkoa_Mzigo wa Kibinafsi(ByVal mtumaji Kama System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Pakia 'Weka msimbo wa mtumiaji ili kuanzisha ukurasa hapa If context.Current.User.Identity.Name = "" Kisha Jibu.Elekeza("login.aspx") Mwingine Response.Andika("

    ”) Maliza Ikiwa Mwisho wa Darasa la Mwisho

    <%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”login.aspx.vb” Inherits=”FormAuth.WebForm1”%> Usajili

    Jina
    Nenosiri

    Uthibitishaji umeshindwa



    Inaagiza System.Xml Inaagiza Mfumo.Web.Security Public Class WebForm1 Inarithi System.Web.UI.Page Inayolindwa Pamoja na Matukio txtName Kama System.Web.UI.WebControls.TextBox Imelindwa Pamoja na Matukio txtPassword As System.Web.UI.WebControls.Textbt As System.Web.UI.WebControls.Label Protected WithEvents btnLogin As System.Web.UI.WebControls.Button #Region “ Msimbo Uliozalishwa wa Muundaji wa Fomu ya Wavuti “ 'Simu hii inahitajika na Mbuni wa Fomu ya Wavuti. Ndogo ya Kibinafsi ya KuanzishaComponent() Maliza Ndogo 'KUMBUKA: Tamko la kishikilia nafasi lifuatalo linahitajika na Mbuni wa Fomu ya Wavuti. ‘Usiifute au kuihamisha. Tamko la Muundaji wa Kishika Nafasi Kama System.Object Private Sub Page_Init(ByVal Sender As System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Init 'CODEGEN: Simu hii ya mbinu inahitajika na Mbunifu wa Fomu ya Wavuti 'Usiirekebishe kwa kutumia kihariri cha msimbo. . InitializeComponent() Maliza Sub #End Region Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Hushughulikia btnLogin.Click Dim xd As New XmlDocument, xr As XmlNodeReader Dim sName As String, xPas Open the String. Load(Server.MapPath(“users.xml”)) ' Amilisha XmlNodeReader xr = New XmlNodeReader(xd.Item("users")) " Tafuta mtumiaji unayemtaka Huku xr.Read If xr.Name = "jina" Na xr .NodeType = XmlNodeType.Element Kisha sName = xr.ReadString " Ikiwa jina la mtumiaji lisilo sahihi, basi nenda kwa lingine If sName<>txtName.Text Kisha xr.Skip() ElseIf xr.Name = “password” Na xr.NodeType = XmlNodeType.Element Kisha If xr.ReadString() = txtPassword.Text Kisha " Iwapo manenosiri yanalingana, basi uthibitishaji ulifanikiwa FormsPassword.RedirectFrontication. ( txtName.Text, True) Vinginevyo " Ikiwa sivyo, basi nenda kwa mtumiaji mwingine xr.Skip() Maliza Ikiwa Mwisho Ikiwa Mwisho Wakati " Ikiwa mstari huu utatekelezwa, basi maelezo ya mtumiaji yaliingizwa kimakosa lbl.Visible = True End Sub End Darasa

    Wacha sasa tufanye "majadiliano": nambari iliyo hapo juu ina kurasa 2. Vitendo vyote huanza kwenye ukurasa wa default.aspx, ambao hukagua ikiwa mtumiaji wa sasa ana jina:

    Ikiwa muktadha.Current.User.Identity.Name = “” Kisha Jibu.Elekeza(“login.aspx”) Mwingine Jibu.Andika(“

    Hujambo " & context.Current.User.Identity.Name &"

    "Mwisho Kama

    Ikiwa kuna moja, salamu itaonyeshwa kwenye skrini, vinginevyo mtumiaji ataelekezwa kwenye ukurasa wa usajili wa login.aspx, ambapo ataulizwa kuingiza jina lake na nenosiri. Taarifa iliyoingizwa inaangaliwa dhidi ya data kutoka kwa faili ya XML. Ikiwa mtumiaji haipatikani, ujumbe wa hitilafu utaonekana (Kielelezo 3), vinginevyo ataelekezwa kwa usalama kwenye ukurasa wa awali wa default.aspx, ambao, akigundua kuwa mtumiaji wa sasa ana jina lililofafanuliwa, atamkaribisha.


    Mchele. 3 - Data ya usajili isiyo sahihi

    Ikiwa umethibitisha kwa ufanisi na kuona salamu, funga dirisha la kivinjari na ujaribu kuzindua ukurasa wa default.aspx tena. Utaona mara moja salamu kwa mtumiaji ambaye jina lake uliingiza mara ya mwisho. Ukweli ni kwamba wakati wa usajili tulihifadhi kuki kwenye mashine ya mteja. Hii ilitokea wakati tulipoita kitendakazi cha RedirectFromLoginPage kwenye msimbo, tukipitisha kigezo chake cha CreatePersistentCookie thamani ya Kweli:

    FormsAuthentication.RedirectFromLoginPage(txtName.Text, True)

    Ili kuzuia kidakuzi kutumwa, piga tu chaguo hili la kukokotoa ukitumia kigezo cha CreatePersistentCookie kilichowekwa kuwa Uongo. Au kuna njia nyingine - katika ukurasa wa default.aspx, ongeza kidhibiti cha tukio cha kupakua ukurasa na nambari ifuatayo:

    Ukurasa_Upakuaji wa Ndogo ya Kibinafsi(Mtumaji wa ByVal Kama Kitu, ByVal e As System.EventArgs) Hushughulikia MyBase.Pakua FormsAuthentication.SignOut() Maliza Sub

    Matokeo yake, baada ya kupakua ukurasa kuu, mtumiaji atajiandikisha kuondoka.

    Uthibitishaji wa fomu kwa kutumia faili ya usanidi:

    Katika mfano uliopita, tulihifadhi data yote ya mtumiaji katika faili tofauti ya XML, lakini inageuka ASP.NET hutoa uwezo wa kuhifadhi taarifa za akaunti moja kwa moja kwenye faili ya usanidi wa mradi wa Wavuti. Faida ya njia hii ni kwamba inahitaji kiasi kidogo msimbo wa programu, kwa sababu katika kesi hii mtayarishaji hawana haja ya kuangalia kwa manually kupitia faili ya XML katika kutafuta mechi zinazofanana - anaita tu kazi moja, ambayo hutatua tatizo zima. Ili kuelewa kanuni ya uendeshaji wa utaratibu huu, hebu tugeuke tena kwenye faili ya usanidi, au tuseme kwa lebo ya fomu. Mbali na sifa zilizoelezwa hapo awali, lebo hii inaweza pia kujumuisha sehemu - vyeti:
    Web.config:

    Kama inavyoonekana kutoka kwa orodha iliyo hapo juu, lebo ya vitambulisho ina sifa moja - passwordFormat. Kigezo hiki huamua jinsi nenosiri linavyohifadhiwa na kuchukua maadili yafuatayo:

    * Futa - nenosiri limehifadhiwa bila mabadiliko yoyote
    * SHA1 - nenosiri linaharakishwa kwa kutumia mbinu ya SHA1 (Toleo la 1 la Salama la Algorithm ya Hash)
    * MD5 - nenosiri linaharakishwa kwa kutumia njia ya MD5 (Toleo la 5 la Digest ya Ujumbe)

    Ukichagua moja ya algorithms ya hashing, nenosiri haliwezi kuhifadhiwa tena katika fomu yake ya asili katika faili ya usanidi - lazima kwanza iwe ya haraka na kisha tu kupewa matokeo yanayotokana na sifa ya nenosiri. Vinginevyo, ASP.NET inapothibitisha, manenosiri hayatalingana.

    Kwa kuwa sasa tuna hifadhidata mpya ya akaunti, hebu turejee kwenye programu-tumizi ya awali na tubadilishe msimbo wa kitufe cha kujisajili bonyeza kidhibiti cha tukio katika ukurasa wa login.aspx:
    login.aspx.vb:

    Private Sub btnLogin_Click(ByVal Sender As Object, ByVal e As EventArgs) Hushughulikia btnLogin.Click If FormsAuthentication.Authenticate(txtName.Text, txtPassword.Text) Kisha " Iwapo mtumiaji alipatikana katika sehemu ya uthibitisho wa cheti, basi Usajili ulifaulu. .RedirectFromLoginPage( txtName.Text, False) Vinginevyo " Vinginevyo, onyesha ujumbe wa hitilafu lbl.Visible = True End If End Sub

    Sasa linganisha nambari hii na ile iliyotumiwa katika mfano uliopita. Kama unavyoona, imepunguzwa kutoka kwa hali nyingi na utafutaji hadi hoja moja tu inayorejesha Kweli au Si kweli.

    Hatutazingatia haswa mfano wa nambari inayofanya kazi na nywila za haraka hivi sasa, ili tusikimbilie mambo. Ukweli ni kwamba katika sehemu ya 3 ya nakala hii, ambayo itatolewa kwa maandishi, utajifunza juu ya ugumu wote wa usimbaji hashi na usimbuaji data na utaweza kutekeleza njia hizi mwenyewe.

    Uthibitishaji wa fomu kwa kutumia hifadhidata:

    Hebu sasa tuangalie mfano wa kufanya kazi na hifadhi ya data ya mtumiaji mwingine - hifadhidata ya MS Seva ya SQL. Tovuti nyingi zinazobadilika hutumia hifadhidata ili kuhifadhi maudhui ya tovuti. Taarifa kuhusu watumiaji pia si ubaguzi na inaweza kuchukua nafasi yake katika hifadhi ya data ya jumla. Ili kuona kwa macho yetu wenyewe jinsi haya yote yanatokea, hebu tuunda maombi ya mtihani, ambayo itakuwa tena kulingana na ukurasa wa usajili ambao tunajua tayari, uliotumiwa katika mifano ya awali. Kwanza kabisa, unahitaji kuandaa hifadhidata; ili kufanya hivyo, fungua matumizi ya SQL Query Analyzer na uendeshe nambari ifuatayo ndani yake, iliyoandikwa katika tSQL:
    FormAuthUsers.sql:

    Unda hifadhidata 'FormAuthUsers' na uongeze jedwali 'Watumiaji' TENGENEZA UFUNGUO WA DATABASE Watumiaji NENDA KUTUMIA FormAuthUsers NENDA KUUNDA JEDWALI ( KITAMBULISHO (1, 1) SIO BATILI, (50), (50), UFUNGUO WA MSINGI WA KIZUIZI ULIOUNGANA ( --WASHA ) Jaza jedwali la 'Watumiaji' WEKA NDANI YA Watumiaji (Jina la Mtumiaji, Nenosiri) THAMANI('Yohana', 'moja') INGIZA NDANI YA Watumiaji (Jina la Mtumiaji, Nenosiri) THAMANI('Mike', 'mbili') NENDA INGIZA KWA Watumiaji (Jina la Mtumiaji, Nenosiri. ) MAADILI('Bili', 'tatu') NENDA --Tengeneza utaratibu 'FindUser' TENGENEZA UTARATIBU FindMtumiaji @Name nvarchar(50), @Nenosiri nvarchar(50) KAMA HESABU CHAGUA(KITAMBULISHO) KUTOKA KWA Watumiaji AMBAPO Jina la mtumiaji = @Jina NA Nenosiri = @Nenosiri GO

    Kuendesha msimbo huu kunapaswa kuunda hifadhidata katika Seva yako ya SQL inayoitwa "FormAuthUsers" ambamo unaweza kupata jedwali la Watumiaji lenye rekodi tatu na utaratibu uliohifadhiwa wa FindUser. Utaratibu huu unarudi idadi ya watumiaji ambao wanakidhi ombi, ambalo linaundwa kutoka kwa vigezo vilivyopitishwa kwa utaratibu huu.

    Sasa kwa kuwa tuna hifadhidata tayari, tunaweza kuanza kuunda ukurasa ambao utafanya kazi nayo. Ili kufanya hivyo, chukua mifano iliyotangulia tena na ubadilishe kidhibiti cha tukio la kubofya kitufe kwenye ukurasa wa login.aspx:
    login.aspx.vb:

    Inaagiza Mfumo.Data.SqlMteja wa Kuagiza Mfumo.Web.Security Public Class WebForm1 Inarithi System.Web.UI.Page Inayolindwa Pamoja na Matukio txtName Kama System.Web.UI.WebControls.TextBox Protected WithEvents txtPassword As System.Web.UIText.Web. WithEvents lbl As System.Web.UI.WebControls.Label Protected WithEvents btnLogin As System.Web.UI.WebControls.Button #Region “ Msimbo Uliotolewa wa Muundaji wa Fomu ya Wavuti “ 'Simu hii inahitajika na Mbuni wa Fomu ya Wavuti. Ndogo ya Kibinafsi ya KuanzishaComponent() Maliza Ndogo 'KUMBUKA: Tamko la kishikilia nafasi lifuatalo linahitajika na Mbuni wa Fomu ya Wavuti. ‘Usiifute au kuihamisha. Tamko la Muundaji wa Kishika Nafasi Kama System.Object Private Sub Page_Init(ByVal Sender As System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Init 'CODEGEN: Simu hii ya mbinu inahitajika na Mbunifu wa Fomu ya Wavuti 'Usiirekebishe kwa kutumia kihariri cha msimbo. . InitializeComponent() End Sub #End Region Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Hushughulikia btnLogin.Click Dim cn As New SqlConnection("server=localhost;database=FormAuthUsers;uid=sa;pwd); Dim cm Kama New SqlCommand(“FindUser”, cn) Dim n As Integer " Fungua muunganisho Jaribu cn.Open() Catch ex As SqlException Response. Andika(ex.Message) Toka Mwisho wa Jaribu " Weka aina ya amri cm.CommandType = CommandType .StoredProcedure " Ongeza vigezo vya jina Dim prmName = New SqlParameter(“@Name”, SqlDbType.NvarChar, 50) prmName.Value = txtName.Text cm.Parameters.Ongeza(prmName) " Ongeza kigezo cha nenosiri Dim = Sq Parm Mpya "@ Password" .RedirectFromLoginPage(txtName.Text, False) Vinginevyo " ikiwa hakuna mtu, basi kuna hitilafu lbl.Visible = True End If cn.Close() End Sub Class

    Ili ukurasa huu ufanye kazi ipasavyo, tafadhali hakikisha kwamba kamba ya muunganisho inalingana na usanidi wako. Hebu tujue nini kinaendelea hapa. Kwanza, kitu cha uunganisho cha SqlConnection huundwa, kupitisha kamba ya unganisho la hifadhidata kama parameta:

    Dim cn Kama New SqlConnection("server=localhost;database=FormAuthUsers;uid=sa;pwd=;")

    Baada ya hayo, mfano wa kitu cha SqlCommand huundwa, ambayo hutumiwa kutekeleza amri za kufanya kazi na data. Mistari inayofuata msimbo hufungua muunganisho, lakini inazingatia uwezekano wa ubaguzi ambao unanaswa na kidhibiti cha ubaguzi wa kujaribu:

    " Fungua muunganisho Jaribu cn.Open() Catch ex Kama SqlException Response. Andika(ex.Message) Toka Sub End Jaribu

    Ikiwa kushindwa yoyote hutokea wakati wa kufungua uunganisho, mtumiaji hupokea ujumbe unaofanana na uendeshaji umesitishwa.

    Kitu cha SqlCommand kisha kimeundwa ili kuendesha utaratibu uliohifadhiwa, na vigezo vya kukiendesha hutayarishwa. Kwa mistari hii 7 ya nambari, bila shaka kuna safu 1 ya mbadala ya nambari:

    cm.CommandText = "tekeleza FindUser "" & txtName.Text & "", "" & txtPassword.Text & """

    Lakini, licha ya ukweli kwamba msimbo huu ni mfupi, wakati wa kukimbia utakuwa mrefu zaidi. Kwa nini? Ukweli ni kwamba kwa mstari huu unafanya swala la uendeshaji, yaani, unaandika moja kwa moja amri ya SQL inayoita utaratibu uliohifadhiwa. Matokeo yake, unahamisha data ya ziada kwenye mtandao kwa namna ya amri ya "exec", ambayo inachukua nafasi katika trafiki ya mtandao; Mara tu ombi hili linapofikia seva, amri ya "exec" itatekelezwa kwanza, na kisha tu utaratibu uliohifadhiwa wa FindUser tunaohitaji utazinduliwa. Kwa kuongezea, kuna njia ngumu zaidi, ambayo ni kuachana na taratibu zilizohifadhiwa na kuingiza nambari zote muhimu za swali moja kwa moja kwenye kitu cha SqlCommand, kama matokeo ambayo habari zaidi zaidi hutumwa. trafiki ya mtandao. Inaweza kuonekana kuwa hii ni pamoja na au minus kadhaa ya ka kadhaa, lakini vipi ikiwa itabidi ufanye kazi na maombi makubwa, nambari ambayo ni kubwa zaidi kuliko ile ya utaratibu wetu? Kwa hivyo, njia bora ni kutumia taratibu zilizohifadhiwa, kwani katika kesi hii unapata mgawanyo wazi wa majukumu, ambayo ukurasa wa mteja unawajibika tu kwa pembejeo / pato la data ndani. kupatikana kwa mtumiaji fomu; Seva ya SQL hufanya shughuli zote za data; na IIS hufanya kama mpatanishi kati ya mteja na seva - hapa unayo usanifu wa tabaka tatu. Usipakue "maridadi" mashine za mteja kazi isiyo ya lazima - ni bora kuikabidhi kwa sanaa nzito, i.e., seva.

    Lakini hebu turudi kwenye kanuni yetu na tuendelee kuichambua: baada ya kuamua aina ya amri na kuandaa vigezo vyote, tunatekeleza amri hii kwa usalama, na kumbuka kuwa kazi ya ExecuteScalar inatumiwa kwa utekelezaji. Inapaswa kutumiwa unapopokea thamani ya scalar kama matokeo, yaani, nambari, ambayo ndiyo hasa hufanyika katika utaratibu wetu wa FindUser - inarejesha idadi ya rekodi zinazokidhi hali fulani:

    Mwishoni mwa msimbo, baada ya kupokea idadi ya rekodi zilizopatikana, tunachambua tu thamani hii na kufanya shughuli zinazofaa.
    Uthibitishaji wa fomu kwa kutumia huduma za Wavuti:

    Wacha tuseme unafanya kazi kwa shirika la XYZ. Umepewa jukumu la kuunda programu ambayo inadhibiti maelezo ya wafanyikazi wa shirika lako. Umekuwa ukifanya kazi kwenye mradi huu kwa miezi 7 na ghafla, kwa sababu za usalama, umepewa jukumu la kupangisha maelezo ya mtumiaji kwenye seva tofauti kabisa ambayo idara nyingine katika shirika la XYZ inafanya kazi nayo kikamilifu. Hukupewa ufikiaji wa moja kwa moja kwa seva, kwa hivyo mradi wako hauwezi kufikia moja kwa moja hifadhidata ya mtumiaji iliyo kwenye seva hii. Ili kutatua tatizo hili, tuliamua kukuruhusu utengeneze huduma ya Wavuti ambayo kwayo unaweza kudhibiti uthibitishaji wa mtumiaji.

    Hadithi hii ya uwongo inaonyesha njia nyingine ya kufanya uthibitishaji - matumizi ya huduma za Wavuti. Huduma za wavuti huwa muhimu hasa wakati wewe au wateja wako hamna ufikiaji kamili kwa seva. Kwa kuongezea, huduma za Wavuti hazitumiki tu kwa programu za Wavuti, lakini pia zinaweza kutumika bidhaa za programu kukimbia kwenye majukwaa mbalimbali. Hii ikawa shukrani inayowezekana kwa matumizi ya teknolojia ya SOAP (Simple Object Access Protocol), ambayo inatumia bandari za kawaida za TCP/IP na itifaki ya HTTP.

    Ili kufanya kazi na huduma ya Wavuti, kwanza unahitaji kuunda. Ili kufanya hivyo, anza mradi mpya kama ASP.NET Huduma ya Wavuti(Mchoro 4).


    Mchele. 4 - Unda Huduma ya Wavuti

    Sasa, kwa kutumia kitufe cha kujiandikisha bonyeza nambari ya kidhibiti cha tukio kutoka kwa mfano uliopita, ubandike ndani chanzo Huduma za wavuti, zimebadilishwa kidogo kwa fomu ifuatayo:
    AuthSrvc.asmx:

    Inaagiza System.Web.Services Inaagiza System.Data.SqlClient _ Huduma ya Hatari ya Umma1 Inarithi Mfumo.Web.Services.WebService #Mkoa " Msimbo Uliotolewa wa Mbunifu wa Huduma za Wavuti " Umma Mpya Mpya() MyBase.Mpya() "Simu hii inahitajika na Mbuni wa Huduma za Wavuti. InitializeComponent() "Ongeza uanzishaji wako mwenyewe msimbo baada ya InitializeComponent() kupiga simu Ndogo ya Mwisho "Inahitajika na Mbuni wa Huduma za Wavuti Vipengele vya Kibinafsi Kama System.ComponentModel.IContainer "KUMBUKA: Utaratibu ufuatao unahitajika na Mbuni wa Huduma za Wavuti "Inaweza kurekebishwa kwa kutumia Mbuni wa Huduma za Wavuti."Fanya hivyo. usiirekebishe kwa kutumia kihariri cha nambari. Private Sub InitializeComponent() components = New System.ComponentModel.Container() Komesha Upakiaji Ndogo Uliolindwa Hubatilisha Tupa Ndogo(ByVal disposing As Boolean) "CODEGEN: Utaratibu huu unahitajika na Mbuni wa Huduma za Wavuti "Usiirekebishe kwa kutumia kihariri cha msimbo. Ikitupa basi Ikiwa Sivyo (vijenzi Sio Kitu) Kisha vijenzi.Tupa() Maliza Ikiwa Mwisho Kama MyBase.Tupa(tupa) Maliza Eneo Ndogo #Mwisho " Chaguo la kukokotoa ambalo hukagua uwepo wa mtumiaji aliye na jina la mtumiaji na nenosiri lililobainishwa. Thibitisha Utendaji wa Umma(Jina la Mtumiaji la ByVal Kama Kamba, Nenosiri la ByVal Kama Kamba, ByRef ErrMessage As String) Kama Boolean Dim cn As New SqlConnection("server=localhost;database=FormAuthUsers;uid=sa;pwd=;") Dim cm Kama SqlCommand Mpya ("FindUser", cn) Dim n As Integer " Fungua muunganisho Jaribu cn.Open() Catch ex As SqlException " Iwapo kuna ubaguzi, basi peleka maelezo yake kwa ErrMessage parameta ErrMessage = ex.Ondoka kwa Kazi ya Ujumbe Mwisho Jaribu " Weka aina ya amri cm. CommandType = CommandType.StoredProcedure " Ongeza vigezo vya jina Dim prmName = New SqlParameter("@Name", SqlDbType.NVarChar, 50) prmName.Value = Jina la mtumiaji cm.Parameters.Add(prmName) " Ongeza kigezo cha nenosiri Dim prmPass = New SqlParameter(" @Nenosiri", SqlDbType.NVarChar, 50) prmPass.Value = Nenosiri cm.Parameters.Ongeza(prmPass) " Tekeleza ombi n = cm.ExecuteScalar " Funga muunganisho cn.Funga () " Chambua matokeo Kama n > 0 Kisha "Iwapo mtu alipatikana, inamaanisha kuwa usajili umefaulu "Rejesha Kweli Kwingine" ikiwa hakuna mtu, basi kuna hitilafu ya Kurejesha Mwisho Uongo Iwapo Darasa la Mwisho la Kazi.

    Unaweza kuangalia utendakazi wa huduma bila kuacha rejista ya pesa, ili kufanya hivi, iendeshe tu katika mazingira ya Visual Studio .NET. Ikiwa hakukuwa na makosa katika huduma, utaona skrini mbele yako na viungo 2. Mmoja wao anaongoza kwa maelezo ya huduma ya Wavuti kwa kutumia WSDL (Lugha ya Maelezo ya Huduma ya Wavuti), na nyingine (Thibitisha) hukuruhusu kujaribu huduma. Bofya kwenye kiungo cha pili na ujaze meza ya vigezo kwenye ukurasa unaoonekana (Mchoro 5). Ukiingiza kamba "John" kwenye uwanja wa Jina la Mtumiaji na ubadilishe "moja" kwa nenosiri, chaguo la kukokotoa litarudi Kweli:

    http://localhost/AuthSrvc/AuthSrvc.asmx/Authenticate: kweli

    Ukibadilisha thamani ya sehemu yoyote kati ya hizi kuwa batili, i.e. kwa moja ambayo haiko kwenye hifadhidata, basi matokeo yatakuwa kinyume - Si kweli.

    Nadhani hakuna maana katika kuchambua msimbo wa kazi hii kwa undani, kwa sababu kwa njia nyingi ni sawa na mtangulizi wake kutoka kwa mfano uliopita. Lakini, hata hivyo, mtu anapaswa kuzingatia Tahadhari maalum kwa kidhibiti cha ubaguzi. Ikiwa katika orodha iliyo na hifadhidata ilionyesha tu ujumbe unaofanana kwenye skrini wakati tofauti yoyote ilitokea, basi katika huduma ya Wavuti tunapitisha ujumbe wa makosa kwa paramu ya ErrMessage ya kazi ya Thibitisha, ambayo ilitangazwa kwa kumbukumbu :.

    " Fungua muunganisho Jaribu cn.Open() Catch ex As SqlException " Iwapo kuna ubaguzi, basi peleka maelezo yake kwa ErrMessage parameta ErrMessage = ex. Message Toka Kazi End Jaribu

    Katika programu ambazo zitatumia huduma hii, tutaunda hundi kwa uwepo wa ubaguzi wowote, na ikiwa hupatikana, tutaonyesha ujumbe unaofaa.


    Mchele. 5 - Kuangalia utendakazi wa huduma ya Wavuti

    Sasa hebu tuunde programu ambayo itatumia huduma hii ya Wavuti, lakini wakati huu tutaenda nje ya mada kidogo na kuunda programu ya Windows kwa mabadiliko:

    1. Unda mradi mpya wa aina ya Windows Application
    2. Badilisha umbo ili lifanane na umbo lililoonyeshwa kwenye mtini. 6, au unaweza kubadilisha msimbo kuwa mjenzi kutoka kwa orodha ifuatayo.
    3. Katika dirisha la SolutionExplorer, bofya kulia kwenye folda ya Marejeleo na uchague Ongeza Rejea ya Wavuti... kutoka kwa menyu ya muktadha inayoonekana.
    4. Utaona mazungumzo ya kuweka viungo vya huduma za Wavuti. Ingiza URL kwenye sehemu anwani kamili kwa faili ya .asmx na utafute. Kama matokeo, unapaswa kuona kitu sawa na Mchoro 7.
    5. Bofya kitufe cha Ongeza Marejeleo na kiungo cha huduma maalum ya Wavuti kitaonekana kwenye mradi wako.
    6.


    Mchele. 6 - Mfano wa maombi ya mtihani
    Mchele. 7 - Matokeo ya Utafutaji wa Huduma ya Wavuti

    Sasa unaweza kuanza kuandika msimbo wa programu unaotumia huduma hii ya Wavuti. Nambari zote zinazohitajika zimepewa hapa chini:
    AuthSrvcRelease.vb:

    Fomu ya Hatari ya Umma1 Inarithi Mfumo.Windows.Forms.Fomu #Mkoa " Msimbo wa Kiunda Fomu ya Windows " Public Sub New() MyBase.New() "Simu hii inahitajika na Mbuni wa Fomu ya Windows. InitializeComponent() "Ongeza uanzishaji wowote baada ya InitializeComponent() piga simu End Sub "Ubatizo wa Fomu ondoa ili kusafisha orodha ya vijenzi. Upakiaji Uliolindwa Hubatilisha Tupa Ndogo(ByVal disposing As Boolean) Ikitupa Basi Ikiwa Sivyo (vipengee Si Kitu) Kisha vipengele.Dispose() Maliza Ikiwa Mwisho Ikiwa MyBase. Tupa (kutupa) Ndogo ya Mwisho "Inahitajika na Vipengee vya Kibinafsi vya Kiunda Fomu ya Windows Kama System.ComponentModel.IContainer "KUMBUKA: Utaratibu ufuatao unahitajika na Mbuni wa Fomu ya Windows "Inaweza kurekebishwa kwa kutumia Kiunda Fomu ya Windows. "Usiirekebishe kwa kutumia kihariri cha msimbo. Rafiki NaMatukio Lebo1 Kama Mfumo.Windows.Forms.Weka Rafiki NaMatukio Lebo2 Kama Mfumo.Windows.Forms.Weka Rafiki NaMatukio txtName As System.Windows.Forms.TextBox Friend WithEvents txtPassword As System.Windows.Windows. .Forms.TextBox Rafiki Mwenye Matukio cmdToka Kama Mfumo.Windows.Forms.Button Rafiki Mwenye Matukio cmdIngia Kama Mfumo.Kitufe. cha.Windows.Forms. Binafsi AnzishaComponent() Me.Label1 = New System.Windows.Forms.Label Me.Label2 = New System.Windows.Forms.Label Me.txtName = New System.Windows.Forms.TextBox Me.txtPassword = Mfumo Mpya.Windows. Forms.TextBox Me.cmdExit = Mfumo Mpya.Windows.Forms.Button Me.cmdLogin = Mfumo Mpya.Windows.Forms.Button Me.SuspendLayout() "Lebo1 " Me.Label1.Location = New System.Drawing.Point(8) , 8) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(40, 16) Me.Label1.TabIndex = 0 Me.Label1.Text = "Jina:" ""Label2" Me.Label2.Location = New System.Drawing.Point(8, 40) Me.Label2.Name = "Label2" Me.Label2.Size = New System.Drawing.Size(64, 16) Me.Label2.TabIndex = 1 Me.Label2.Text = "Nenosiri:" " "txtName" Me.txtName.Location = Mfumo Mpya.Drawing.Point(80, 5) Me.txtName.Name = "txtName" Me.txtName.Size = Mfumo Mpya.Mchoro .Size(216, 20) Me.txtName.TabIndex = 2 Me.txtName.Text = "" " "txtPassword " Me.txtPassword.Location = New System.Drawing.Point(80, 37) Me.txtPassword.Name = " txtPassword" Me.txtPassword.PasswordChar = Microsoft.VisualBasic.ChrW(42) Me.txtPassword.Size = Mfumo Mpya.Drawing.Size(216, 20) Me.txtPassword.TabIndex = 3 Me.txt "TextPasword" cmdExit " Me.cmdExit.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.cmdExit.Location = New System.Drawing.Point(216, 72) Me.cmdExit.Name = "cmdExit" Me.cmdExit.Size = Mpya System.Drawing.Size(80, 24) Me.cmdExit.TabIndex = 4 Me.cmdExit.Text = "Toka" " "cmdLogin " Me.cmdLogin.Location = New System.Drawing.Point(128, 72) Me.cmdLogin .Name = "cmdLogin" Me.cmdLogin.Size = New System.Drawing.Size(80, 24) Me.cmdLogin.TabIndex = 5 Me.cmdLogin.Text = "Ingia" ""Form1" Me.AcceptButton = Me.cmdLogin Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.CancelButton = Me.cmdExit Me.ClientSize = New System.Drawing.Size(304, 103) Me.Controls.Add(Me.cmdLogin) Me.Controls .Ongeza(Me.cmdExit) Me.Controls.Add(Me.txtPassword) Me.Controls.Add(Me.txtName) Me.Controls.Add(Me.Label2) Me.Controls.Add(Me.Label1) Me.FormBorderStyle. = System.Windows.Forms.FormBorderStyle.FixedDialog Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "Form1" Me.Text = "AuthSrvc Test Application" Me.ResumeLayout(False) Maliza Ndogo #Mwisho_Mkoa wa Faragha Ccmd (ByVal mtumaji Kama System.Object, ByVal e As System.EventArgs) Hushughulikia cmdLogin.Bofya " Weka rejeleo la kitu Dim au As New localhost.Service1 Dim sErr As String, bln As Boolean " Angalia Mshale = Vishale. WaitCursor bln = au.Authenticate(txtName.Text, txtPassword.Text, sErr) Mshale = Cursors.Chaguo-msingi " - Lakini kwanza, hebu tuzingatie vighairi vinavyowezekana Iwapo sErr<>"" Kisha MsgBox(sErr) Toka Mwisho wa Ndogo Ikiwa " - Sasa hebu tuendelee kwenye tiki kuu If bln = True Then MsgBox("Hello " & txtName.Text, MsgBoxStyle.Information) Else MsgBox("Data si sahihi!", MsgBoxStyle .Mshangao ) Maliza Ikiwa Komesha Sub Private cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Hushughulikia cmdExit.Bofya End End Sub Class

    Katika mfano huu unaweza kuona nambari rahisi sana ambayo ni: simu ya kawaida kazi ambayo hufanya shughuli zote muhimu.

    Kama ilivyoelezwa hapo awali, huduma za Wavuti zinategemea teknolojia ya SOAP na kwa hivyo zinaweza kutumiwa na programu zinazoendesha kwenye jukwaa tofauti kabisa. Hatutaenda mbali sana katika kuacha Windows, lakini tutajaribu kupiga huduma hiyo hiyo ya Wavuti bila kutumia teknolojia za .NET, yaani, moja kwa moja kupitia SOAP. Ili kufanya hivyo, tengeneza faili inayofuata script katika Toleo la Hati ya Visual Basic (VBScript) na uiendeshe:
    SOAP.vbs:

    " Unda mfano wa kitu cha SoapClient Set sc = CreateObject("MSSOAP.SoapClient") " Unganisha kwenye huduma ya wavuti na upigie njia ya Thibitisha sc.mssoapinit "http://localhost/AuthSrvc/AuthSrvc.asmx?WSDL" Ikiwa sc. .Thibitisha (" John", "one", s) = True Then MsgBox "Hello John", 64 Else MsgBox "Wrong data!!", 48 Maliza Kama "Futa marejeleo ya kitu Set sc = Nothing

    Kama unaweza kuona, kwa kutumia mfano wa kitu Ukiwa na SOAP, unaweza kufikia huduma za Wavuti kwa kutumia anuwai ya lugha za programu (hata hati!) na majukwaa.

    Lakini sio kila kitu ni kamili kama inavyoonekana. Chini ya mpangilio mzuri wa huduma za Wavuti kuna mitego iliyofichwa, kwanza kabisa, usalama wao wenyewe. Huduma za wavuti zina muundo salama wa XML, ambao unaweza kuzuiwa na data inayotumwa inaweza kueleweka na kupatikana tena. Kuondoa, au tuseme kupunguza uwezekano wa uvujaji wa habari hiyo, ni muhimu kupata huduma za mtandao. Kuna idadi ya teknolojia kwa madhumuni haya, lakini tatu tu kati yao ndizo zinazojulikana zaidi: sheria za Firewall, Tabaka la Soketi salama (SSL) na Mtandao wa Kibinafsi wa Kibinafsi (VPN).

    Ikiwa unajua hasa kompyuta ambazo zitafikia huduma yako ya Wavuti, basi katika kesi hii chaguo la kutumia sheria za Firewall zinafaa kwako, ambapo unaweza kuweka vikwazo na haki kwa anwani maalum za IP, hivyo njia hii inatumika zaidi kwa mitandao ya ndani , ambapo huna haja ya kuwa na wasiwasi sana kuhusu usiri wa taarifa zinazopitishwa. Njia rahisi sana ya kufanya hivyo ni Usalama wa Microsoft na Seva ya Kuongeza Kasi (ISA). Inatoa sheria za juu za sera zinazokuwezesha kuzuia au, kinyume chake, kufungua ufikiaji wa habari kwa wateja maalum.

    SSL inafaa zaidi kwa Mitandao ya mtandao. Wakati wa kuitumia, data imesimbwa na kuhamishwa kati ya seva na mteja; data iliyopokelewa basi inathibitishwa, kwa hivyo kuangalia ikiwa data ilitoka kwa chanzo sahihi. Hii hutokea kwa matumizi ya vyeti, ambayo lazima ifanyike na seva na mteja, kwa hiyo kwa upande mmoja, matumizi ya vyeti inakuwezesha kuhakikisha kuwa data huanguka kwa mikono ya kulia, lakini kwa upande mwingine. unahitaji kuwa na uhakika kwamba mpokeaji ana cheti sahihi. Kwa hivyo, kutumia SSL unahitaji:

    1. Pata vyeti: vyeti ni vya kibiashara na majaribio. Tofauti kati yao ni kwamba moja ya kibiashara itasajiliwa rasmi kwa jina la mnunuzi na, ipasavyo, itagharimu pesa, wakati jaribio linaweza kupatikana bure, lakini bila usajili rasmi. Cheti kinaweza kupatikana kwa anwani ifuatayo: http://www.verisign.com/. Lakini haijalishi ni aina gani ya cheti unachoagiza, bado utahitaji kupakua 2: moja kwa seva, na nyingine kwa wateja (pia inaitwa Mamlaka ya Cheti (CA)).
    2. Sanidi seva na usakinishe vyeti kwenye vivinjari vya mteja: zaidi kwa uthibitishaji uliofaulu Maombi ya SSL unahitaji kuongeza vyeti kwenye seva na kwenye mashine za mteja. Aidha, vyeti vya mteja sio lengo la kompyuta, lakini kwa kivinjari, yaani, ikiwa mtumiaji anatumia Internet Explorer na Netscape, ni vyema kumpa vyeti kwa vivinjari vyote viwili. Hata hivyo, vyeti vya seva pia imekusudiwa aina tofauti seva (Kwenye Verisign unaweza kupata vyeti kwa aina zaidi ya 50 za seva), lakini tofauti pekee ni kwamba wao, kama sheria, hazibadilika, isipokuwa toleo jipya limewekwa.

    KUMBUKA

    Lakini, licha ya kukosekana kwa usajili rasmi, cheti cha majaribio ni halali.

    VPN ni kiendelezi cha mtandao wa ndani kulingana na matumizi ya mtandao wa kimataifa, hasa mtandao. Kwa mfano, mtumiaji anayefanya kazi kwenye mashine ya mbali anaweza kuunganisha kwenye mtandao wa ndani kupitia VPN huku akitumia Intaneti. Kwa teknolojia hii, unaweza kutuma data kati ya kompyuta kupitia muunganisho salama kwa sababu VPN ina vipengele vya usalama sawa na mtandao wa ndani. Moja ya ubaya wa VPN ni hitaji la muunganisho wa muda mrefu kwa kazi yenye ufanisi. Kwa mawasiliano, VPN hufanya kazi kwa kutumia itifaki zifuatazo: Itifaki ya Uelekezaji wa Uelekezaji wa Uhakika kwa Uhakika (PPTP), iliyojumuishwa na Windows NT 4.0 na Windows 2000, au Itifaki ya Kuunganisha ya Tabaka la Pili (L2TP), inayopatikana katika Windows 2000.
    KUMBUKA

    Orodha ya mifumo ya uendeshaji inayofaa inaonyesha wale tu ambao itifaki hizi zilipatikana kutoka kwa matoleo, yaani mifumo hii ya uendeshaji inapaswa kujumuisha zaidi. matoleo ya baadaye mfano Windows XP, Windows 2003 Server.

    Huduma za mtandao na usalama wao ni ya kuvutia sana na mada za sasa, kutokana na kwamba ukuaji wa umaarufu wa huduma za Mtandao umeongezeka kwa ujio wa .NET Framework na VS.NET. Lakini hatutaenda zaidi katika maelezo, lakini tutarudi kwenye mkondo mkuu wa nakala hii. Unaweza kujua teknolojia hizi zote kwa urahisi mwenyewe. Ili kufanya hivyo, unahitaji tu tamaa kidogo, uvumilivu na wakati wa bure. Ninaweza tu kukupa alama za mwongozo zinazoweza kukuongoza kwenye njia sahihi:

    * http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/default.asp
    * http://www.microsoft.com/isaserver
    * http://support.microsoft.com/default.aspx?scid=kb;EN-US;q307267
    * http://www.w3.org/TR/wsdl.html
    * http://www.w3.org/TR/SOAP/

    Uthibitishaji wa pasipoti:

    Pasipoti ni mfumo mmoja wa kuingia katika akaunti ulioundwa na Microsoft na unaweza kutumika kwenye tovuti yoyote ambayo ni mwanachama wa ofa hii. Moja faida muhimu Teknolojia hii ni kwamba mtumiaji haitaji kukumbuka data ya usajili kwa kila tovuti tofauti, ambayo mara nyingi hutokea wakati akaunti uliyoizoea tayari inamilikiwa kwenye tovuti fulani. Pasipoti inakuwezesha kutatua tatizo hili kutokana na ukweli kwamba hutumia database ya kawaida ya watumiaji, hivyo kwenye tovuti zinazounga mkono .NET Pasipoti utaingia daima data sawa ya usajili: barua pepe yako na nenosiri.

    Mbinu ya uthibitishaji kulingana na Pasipoti hutumia teknolojia za kawaida za Wavuti kwa urahisi wa matumizi na faragha:

    * Itifaki salama ya SSL
    *vidakuzi
    * JavaScript 1.2
    * Usimbaji fiche wa 3DES

    Ili kutambua nguvu kamili ya pasipoti yako, unahitaji kufuata hatua hizi:

    1. Pakua .NET pasi SDK kutoka kwa anwani ifuatayo: http://msdn.microsoft.com/library/default.asp?url=/downloads/list/websrvpass.asp

    2. Baada ya hayo, unapaswa kusajili tovuti yako na huduma ya .NET Pasipoti: http://go.microsoft.com/fwlink/?LinkID=9732. Usipojisajili, chaguo zako zitakuwa chache sana na hutaweza kupata matokeo yanayotarajiwa kikamilifu, kwa mfano, kutoka (yaani, kuondoka) itabidi ufunge madirisha yote ya kivinjari kisha ufute vidakuzi vyote. faili zote. na data ya pasipoti

    Kama vile unapotumia aina zingine za uthibitishaji, kwanza unahitaji kusanidi faili ya usanidi wa mradi. Orodha ifuatayo inaonyesha maudhui ya msingi ya sehemu ya uthibitishaji ya faili ya usanidi:

    Katika msimbo huu, tunaweka aina ya uthibitishaji wa pasipoti, baada ya hapo tunaweka parameter moja ambayo inasanidi uthibitishaji wa pasipoti - anwani ya ukurasa ambao mtumiaji ataelekezwa ikiwa haja ya kujiandikisha itatokea:

    Kipengele kingine kinachounganisha aina zote za uthibitishaji ni kiolesura cha IIdendity, kwa msingi ambao madarasa yote ya habari ya mtumiaji kwa aina mbalimbali uthibitisho. Uthibitishaji wa pasipoti pia sio ubaguzi kwa orodha hii, na zana inayotekelezea sifa zote kuu ni kitu cha System.Web.Security.PassportIdentity cha .NET Framework.

    Ili kuonyesha kiunga cha ukurasa wa usajili, ni kawaida kutumia nembo maalum ambayo hupakuliwa kupitia mtandao. Kwa sababu nembo hii kwa kawaida hutumiwa mara kwa mara, ni bora kuunda udhibiti tofauti ambao unatekelezea sehemu ya uthibitishaji. Ili kufanya hivyo, fuata hatua hizi:

    1. Unda mradi mpya wa aina ya ASP.NET Web Application katika VS.NET
    2. Ongeza Udhibiti wa Mtumiaji wa Wavuti kwake na uipe jina passport.ascx
    3. Badilisha msimbo wake wa chanzo na ufuatao:

    passport.ascx.vb:

    Inaagiza Mfumo.Web.Usalama wa Pasipoti ya Hatari ya Umma Inarithi Mfumo.Web.UI.Udhibiti wa Mtumiaji #Mkoa " Msimbo Unaozalishwa wa Kiunda Fomu ya Wavuti " "Simu hii inahitajika na Mbuni wa Fomu ya Wavuti. Ndogo ya Kibinafsi ya KuanzishaComponent() Maliza Ndogo "KUMBUKA: Tamko la kishikilia nafasi lifuatalo linahitajika na Mbuni wa Fomu ya Wavuti. "Usiifute au kuihamisha. Tamko la Muundaji wa Kishikilia Nafasi Kama System.Object Private Sub Page_Init(ByVal Sender As System.Object, ByVal e As System.EventArgs) Hushughulikia MyBase.Init "CODEGEN: Simu hii inahitajika na Mbunifu wa Fomu ya Wavuti "Usiirekebishe kwa kutumia kihariri cha msimbo. . InitializeComponent() Maliza Kitambulisho kidogo cha #Mkoa_Mpakiaji(ByVal mtumaji Kama System.Object, ByVal e As System.EventArgs) Hushughulikia Kitambulisho cha MyBase.Pakia Dim Kama PassportIdentity " Pata data kuhusu kitambulisho cha sasa cha mtumiaji = CType(context.User.Identity) , PassportIdentity) " Onyesha kitufe cha usajili Response.Write(id.LogoTag()) Maliza Daraja la 1. Baada ya hapo, badilisha jina la ukurasa wa mradi wa Wavuti kuingia.aspx na uweke msimbo wa muundo wa ukurasa ufuatao: login.aspx :<%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="PassAuth.WebForm1"%> <%@ Register TagName="passport" TagPrefix="ctl" src="passport.ascx"%> Ingia



    Vitendo vyote vya msingi vya uthibitishaji wa mtumiaji vinachukuliwa na kitu cha PassportIdentity, au tuseme huduma ya Pasipoti ya Microsoft, ambayo Mfumo wa NET unapata kwa kutumia kitu cha PassportIdentity. Ndiyo maana unachotakiwa kufanya ni kupata manufaa, lakini ili kujua ni nini hasa unachoweza na unachopaswa kuvuna, rejea Jedwali 1, ambalo linaelezea sifa zote zinazoweza kuelezea mtumiaji aliyesajiliwa.

    Jina la sifaMaelezo
    UfikivuHuamua kama chaguo za ufikivu zinafaa kuruhusiwa kwa fulani
    mtumiaji kwenye tovuti zote za wanachama wa Pasipoti ya Microsoft
    BDay_precisionHuamua usahihi wa sifa ya Tarehe ya Kuzaliwa
    Tarehe ya kuzaliwaIna tarehe au mwaka wa kuzaliwa wa mtumiaji, kulingana na thamani
    BDay_precision sifa
    JijiGeoID inayohifadhi maelezo ya eneo
    mtumiaji
    NchiMsimbo wa nchi ya mtumiaji kwa Kiwango cha ISO 3166
    OrodhaBado haijatumika
    Jina la kwanzaJina la mtumiaji
    BenderaIna chaguo za wasifu wa mtumiaji
    JinsiaHubainisha jinsia ya mtumiaji
    Lang_PreferenceLCID ya lugha ya taifa ya mtumiaji
    Jina la familiaJina la Mwisho la Mtumiaji
    MemberIDJuuKitambulisho cha kipekee cha mtumiaji cha kiwango cha juu cha PUID
    MemberIDChiniKitambulisho cha kipekee cha mtumiaji cha kiwango cha chini cha PUID
    Jina la MwanachamaIna jina la mtumiaji na jina la kikoa likitenganishwa na ishara ya "@".
    Jina la utaniInayofaa mtumiaji
    KaziIna baadhi Taarifa za ziada kuhusu mtumiaji, katika
    hasa, aina ya shughuli
    Msimbo wa PostaMsimbo wa posta wa mtumiaji nchini Marekani au katika nchi nyingine
    PreferredEmailAnwani ya barua pepe ya mtumiaji
    ProfailiVersionToleo la wasifu wa mtumiaji
    MkoaGeoID inayoonyesha mahali anapoishi mtumiaji
    nchi
    TimeZoneHubainisha saa za eneo ambalo mtumiaji anaishi
    MkobaHuamua ikiwa mtumiaji huhifadhi pasipoti ndani
    pochi

    Jedwali 1 - Chaguzi za Wasifu wa Mtumiaji

    Kuna njia mbili za kufikia sifa hizi zote: Njia ya GetProfileObject ya kitu cha PassportIdentity na kupitia mali ya Kipengee cha kitu kimoja. Orodha ifuatayo, iliyoandikwa katika C #, inaonyesha njia hizi zote mbili kwa vitendo:
    default.aspx.cs:

    kwa kutumia System.Web.Security; ... utupu wa faragha Page_Load(object mtumaji, System.EventArgs e) ( PassportIdentity id; id = (PassportIdentity)User.Identity; Response.Write(id["Firstname"] + "
    "); Jibu. Andika(id.GetProfileObject("Jina la Mwisho") + "
    "); }

    Sasa hebu turudi kwenye mradi wetu na udhibiti wa passport.ascx na tumalize ukurasa wa usajili. Ili kufanya hivyo, rekebisha faili za login.aspx na login.aspx.vb kama ifuatavyo:
    login.aspx:

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="PassAuth.WebForm1"%> <%@ Register TagName="passport" TagPrefix="ctl" src="passport.ascx"%> Ingia

    Tafadhali ingia...

    PUID:
    Jina la kwanza:
    Jina la familia:
    Barua pepe:


    Kama unavyojua, tovuti nyingi zina aina sawa ya mpangilio wa ukurasa unaokubalika kwa ujumla, sehemu yake muhimu ambayo ni kichwa na kijachini na, labda...

    Kama sehemu ya teknolojia ya ASP.Net Web Forms, kuna seti ya vidhibiti vya kuunda na kutumia akaunti za watumiaji:

    • Ingia - mfumo wa udhibiti wa kuunganisha mtumiaji (kuingiza jina na nenosiri) na kuangalia kufuata kwake data zilizomo kwenye hifadhidata. Ikiwa data inalingana (yaani, mtumiaji ameidhinishwa), basi ukurasa unaelekezwa kwa ukurasa ulioombwa.
    • LoginView - hukuruhusu kuonyesha habari mbalimbali kwa watumiaji waliounganishwa. Kwa mfano, unaweza kutumia ukurasa huu kuonyesha maelezo ambayo yanapatikana kwa watumiaji walioidhinishwa pekee.
    • LoginStatus - udhibiti unaoonyesha kiungo cha ukurasa wa kuingia kwa watumiaji ambao hawajaidhinishwa (Toka), na kiungo cha ukurasa wa kuondoka kwa watumiaji waliounganishwa (Ingia).
    • LoginName - kitengo cha kudhibiti kinachoonyesha jina la mtumiaji la sasa ikiwa ameunganishwa kwenye mfumo.
    • Urejeshaji wa Nenosiri - mfumo wa udhibiti wa kurejesha nenosiri la mtumiaji kwa kutuma ujumbe wa barua pepe au wakati mtumiaji anajibu swali la usalama.
    • CreateUserWizard ni mfumo wa udhibiti unaokusanya taarifa kuhusu mtumiaji mpya na kuunda akaunti mpya katika hifadhidata.
    • Badilisha Nenosiri - udhibiti unaoruhusu mtumiaji aliyeunganishwa kubadilisha nenosiri.

    Udhibiti wa Kuingia unatoa kiolesura kilicho tayari kutumia ambacho huuliza jina na nenosiri la mtumiaji. Inajumuisha kitufe chenye sifa ya CommandName-"Ingia" kwa ajili ya kuunganisha mtumiaji. Mtumiaji anapobofya kitufe hiki, kidhibiti hukagua kiotomati mawasiliano ya jina la mtumiaji na nenosiri lililowekwa na data iliyomo kwenye hifadhidata, na kisha husababisha mpito kwa fomu ya wavuti iliyoombwa ya programu. Udhibiti huu unaweza kupanuka kabisa na hukuruhusu kubatilisha lebo, mtindo na sifa zake, na pia kushughulikia matukio mwenyewe ili kubadilisha tabia chaguo-msingi.Mfano wa kusanidi maelezo ya udhibiti wa Kuingia umeonyeshwa. hapa chini:

    <%@ Page Language="C#" AutoEventWireup="true”

    CodeFile="LogPage.aspx.cs" Inherits="LogPage" %>

    BorderColor="Nyeusi" BorderStyle="double">

    Uunganisho kwenye mfumo

    ControlToValidate="Nenosiri" ErrorMessage="*" />

    Onyesho la kitengo cha udhibiti wa Kuingia kilichosanidiwa hapo juu linaonyeshwa kwenye Mtini. 4.22.

    Mchele. 4.22. Inaonyesha kitengo cha udhibiti wa Kuingia kilichosanidiwa

    Udhibiti wa LoginView ni rahisi na wenye nguvu. Inakuruhusu kuonyesha seti tofauti za ES kwa watumiaji wasiojulikana na walioidhinishwa. Kwa kuongeza, inakuwezesha pia kuonyesha uchanganuzi wa maudhui kwa kuzingatia jukumu ambalo mtumiaji aliyeunganishwa ni wa. Kiolesura cha LoginView ni kiolesura cha violezo chenye aina tofauti za violezo: kimoja kwa watumiaji wasiojulikana, kingine kwa watumiaji walioidhinishwa, na cha tatu kusaidia violezo vinavyotegemea jukumu.

    Violezo hivi vinahitaji tu kuongeza vidhibiti ili kuwakilisha hali husika, kama inavyoonyeshwa hapa chini. Udhibiti huu unaonyesha maandishi rahisi kwa watumiaji wasiojulikana na maandishi kadhaa kwa watumiaji waliojiandikisha:

    Bbi ni mtumiaji asiyejulikana

    Bbi imeunganishwa kwenye web-npHno>KeHHK>

    <1т2>Wasimamizi pekee ndio wanaoweza kuona maudhui haya

    Maudhui haya ni ya wabunifu wa wavuti na wasomaji

    Mifano ya kutumia ES ili kuhakikisha usalama wa programu ya wavuti inaweza kutazamwa katika folda ya Akaunti ya kiolezo cha kawaida cha Tovuti ya ASP.Net.

    Ilisasishwa mwisho: 10/31/2015

    Kutolewa kwa ASP.NET MVC 5 kuliwekwa alama kwa kutolewa kwa mfumo mpya wa uidhinishaji na uthibitishaji katika programu za .NET uitwao ASP.NET Identity. Mfumo huu unachukua nafasi ya watoa huduma rahisi wa Uanachama ambao walianzishwa katika ASP.NET MVC 4.

    Kwa kubofya kitufe cha Badilisha Uthibitishaji, tunaweza kubadilisha aina ya uthibitishaji kwa kuchagua mojawapo ya yafuatayo:

      Hakuna Uthibitishaji: Kitambulisho cha ASP.NET na hakuna mfumo wa uthibitishaji uliojengwa ndani

      Akaunti za Mtumiaji Binafsi: Mradi kwa chaguomsingi ni pamoja na mfumo wa Utambulisho wa ASP.NET, unaokuruhusu kuidhinisha watumiaji wote wawili ndani ya programu na kutumia huduma za nje kama vile Google, Twitter, n.k.

      Hesabu za Shirika: zinafaa kwa tovuti na programu za wavuti za makampuni na mashirika binafsi

      Uthibitishaji wa Windows: mfumo wa uthibitishaji wa mitandao ya intraneti kwa kutumia akaunti za Windows

    Hebu tuache thamani chaguo-msingi, yaani, Akaunti za Mtumiaji Binafsi, na tuunde mradi.

    Mradi ulioundwa tayari kwa chaguo-msingi una miundombinu yote muhimu kwa idhini: mifano, vidhibiti, maoni. Ikiwa tutaangalia nodi ya Marejeleo, tutaona idadi ya maktaba muhimu hapo, ambayo yana madarasa muhimu kwa idhini na uthibitishaji:

    Hizi ni idadi ya maktaba za OWIN ambazo zinaongeza utendaji wa OWIN kwenye mradi, na maktaba tatu za ASP.NET Identity yenyewe:

      Microsoft.AspNet.Identity.EntityFramework: ina madarasa ya Mfumo wa Huluki unaotumia Utambulisho wa ASP.NET na kuwasiliana na Seva ya SQL

      Microsoft.AspNet.Identity.Core: Ina idadi ya violesura muhimu vya Utambulisho wa ASP.NET. Utekelezaji wa miingiliano hii itakuruhusu kwenda zaidi ya Seva ya MS SQL na kutumia DBMS zingine, pamoja na mifumo ya NoSQL, kama hifadhi ya akaunti.

      Microsoft.AspNet.Identity.OWIN: Huleta uthibitishaji wa OWIN kwa programu ya ASP.NET MVC kwa kutumia Utambulisho wa ASP.NET

    Kwa kuwa miundombinu yote tayari iko kwenye mradi, hebu tuzindue mradi na tupate kiungo kwenye ukurasa unaoonyeshwa kwenye kivinjari. Sajili na bonyeza juu yake. Kwenye ukurasa wa usajili unaofungua, ingiza data fulani:

    Baada ya usajili, kuingia kutaonyeshwa kwenye kona ya juu ya kulia ya ukurasa wa wavuti wa programu ya wavuti. Baada ya kukamilisha usajili, tunaweza kuondoka kwa kubofya LogOff na kuingia tena. Kwa hivyo, tunaweza tayari kuanza kutumia mfumo wa uthibitishaji uliojengwa katika programu ya ASP.NET MVC 5. Sasa hebu tuangalie pointi zake kuu.

    Kwanza, haya yote yamehifadhiwa wapi? Data ya mtumiaji aliyesajiliwa huenda wapi?

    Katika kesi hii, mbinu ya Kanuni ya Kwanza inatumiwa. Faili ya web.config tayari ina mfuatano wa chaguo-msingi wa muunganisho unaobainisha saraka ya hifadhidata. Ikiwa tutapanua folda ya App_Data, tunaweza kuona hifadhidata iliyoundwa:

    Ikiwa ghafla hifadhidata haionekani kwenye folda, bofya kitufe cha Onyesha Faili Zote juu ya dirisha la Solution Explorer.

    Tunaweza kufungua hifadhidata hii kwenye dirisha la Kichunguzi cha Seva na kuona yaliyomo:

    Kwa chaguo-msingi, mtumiaji wa kwanza anapojiandikisha, seti zifuatazo za meza huundwa:

      MigrationHistory: inatumiwa na EntityFramework kwa uhamishaji wa hifadhidata

      AspNetRoles: ina ufafanuzi wa jukumu

      AspNetUserClays: jedwali linalohifadhi seti ya madai. Dai huanzisha muundo tofauti wa uidhinishaji ikilinganishwa na majukumu. Kwa kusema, dai lina habari fulani kuhusu mtumiaji, kwa mfano, anwani ya barua pepe, kuingia, umri, n.k. Na habari hii inakuwezesha kutambua mtumiaji na kumpa haki zinazofaa za kufikia.

      AspNetUserLogins : jedwali la kuingia kwa mtumiaji

      AspNetUserRoles: jedwali linaloweka majukumu mahususi kwa watumiaji

      AspNetUsers: jedwali halisi la mtumiaji. Ikiwa tutaifungua, tutaona data ya mtumiaji aliyesajiliwa

    Vitu muhimu katika Utambulisho wa AspNet ni watumiaji na majukumu. Utendaji wote wa kuunda, kufuta watumiaji na kuingiliana na duka la watumiaji huhifadhiwa katika darasa la UserManager. Kufanya kazi na majukumu na usimamizi wao, AspNet Identity inafafanua darasa la RoleManager. Madarasa ya UserManager na RoleManager yanapatikana katika maktaba ya Microsoft.AspNet.Identity.Core.

    Kila mtumiaji kwa Kidhibiti cha Mtumiaji anawakilisha kitu cha kiolesura cha IUser. Na shughuli zote za usimamizi wa mtumiaji zinafanywa kupitia hifadhi inayowakilishwa na kitu cha IUserStore.

    Kila jukumu linawakilisha utekelezaji wa kiolesura cha IRole, na majukumu yanadhibitiwa na darasa la RoleManager kupitia IRoleStore.

    Utekelezaji wa moja kwa moja wa violesura vya IUser, IRole, IUserStore na IRoleStore hutolewa na Microsoft.AspNet.Identity.EntityFramework namespace:

    Darasa la IdentityUser ni utekelezaji wa kiolesura cha IUser. Na darasa la duka la watumiaji - UserStore - hutekelezea kiolesura cha IUserStore.

    Vile vile, darasa la IdentityRole hutekelezea kiolesura cha IRole, na daraja la duka la RoleStore hutekelezea kiolesura cha IRoleStore.

    Na kuingiliana na hifadhidata, darasa la muktadha la IdentityDbContext limefafanuliwa katika nafasi ya majina ya Microsoft.AspNet.Identity.EntityFramework.

    Katika programu ya ASP.NET MVC, hatutafanya kazi moja kwa moja na IdentityUser na IdentityDbContext madarasa. Kwa chaguo-msingi, faili huongezwa kwa mradi kwenye folda ya Models IdentityModels.cs, ambayo ina ufafanuzi wa madarasa ya watumiaji na muktadha wa data:

    Mtumiaji wa Utumizi wa darasa la umma: Mtumiaji wa Kitambulisho ( Task async ya umma GenerateUserIdentityAsync(UserManager meneja) ( var userIdentity = await manager.CreateIdentityAsync(hii, DefaultAuthenticationTypes.ApplicationCookie); rudisha userIdentity; ) ) darasa la umma ApplicationDbContext: IdentityDbContext ( public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) ( ) hadharani tuli ApplicationDbContext Create() ( rudisha ApplicationDbContext(); ) )

    Katika programu, hatufanyi kazi moja kwa moja na madarasa ya IdentityUser na IdentityDbContext, lakini badala yake tunashughulika na madarasa ya kizazi.

    Darasa la ApplicationUser hurithi mali zote kutoka kwa IdentityUser. Na pia inaongeza njia ya GenerateUserIdentityAsync(), ambayo huunda kitu cha ClaimsIdentity kwa kupiga UserManager.CreateIdentityAsync. Kipengee hiki kina maelezo kuhusu mtumiaji huyu.

    Usanifu huu unakuwezesha kuchukua kazi iliyopangwa tayari na, ikiwa ni lazima, kuongeza mpya, kwa mfano, kuongeza mali mpya kwa mtumiaji au kuongeza meza mpya kwenye hifadhidata.

    Sitaelezea kwa undani utendakazi wote wa Utambulisho wa AspNet, ambao huongezwa kwa mradi kwa chaguo-msingi; nitaelezea kwa ufupi tu uwezo mkuu.

    Kwanza, ili kuwezesha Utambulisho wa AspNet, faili mbili zinaongezwa kwenye mradi kwenye folda ya App_Start. Faili Anzisha.Auth.cs ina darasa la kuzindua programu ya OWIN. Kwa kuwa Utambulisho wa AspNet hutumia miundombinu ya OWIN, darasa hili ni mojawapo ya ufunguo na muhimu kwa kazi.

    Faili IdentityConfig.cs ina idadi ya madarasa saidizi ya ziada: huduma za uthibitishaji wa vipengele viwili kwa kutumia barua pepe na simu EmailService na SmsService , darasa la meneja wa mtumiaji ApplicationUserManager , ambayo huongeza idadi ya vitendaji vya ziada kwa UserManager, na darasa la ApplicationSignInManager, linalotumiwa kuingia na kutoka. ya tovuti.

    Utendaji msingi wa mfumo wa uthibitishaji na usimamizi wa akaunti unapatikana katika vidhibiti viwili: AccountController na ManageController.

    AccountController inafafanua mbinu za kuingia, usajili, uthibitishaji wa msimbo uliotumwa kwa barua pepe au SMS, kuweka upya nenosiri, ukumbusho wa nenosiri, kuingia kwenye tovuti kwa kutumia huduma za nje. Kidhibiti cha Kidhibiti kinatumika kudhibiti akaunti na hutoa uwezo wa kubadilisha nenosiri na kudhibiti nambari za simu kwenye mfumo. Kwa vidhibiti vyote viwili, maoni yote muhimu na mifano maalum ya kutazama hutolewa kwa chaguo-msingi.

    Licha ya ukweli kwamba kwa chaguo-msingi tayari tumepewa kazi iliyopangwa tayari, katika hali nyingine, kwa mfano, kutuma SMS au barua pepe, usanidi wa ziada unahitajika. Sasa hebu tuangalie pointi kuu za mfumo wa Kitambulisho cha AspNet.