0

WCF pro začátečníky – 7. díl: Autentizace poprvé

autor Kryštof Laryš | publikováno 15. září 2010


Možností, jak implementovat autentizaci ve WCF je hned několik. My si popíšeme dvě z nich. Autentizaci pomocí ASP.NET Membership Provider a Custom Membership Provider. V tomto díle to bude ASP.NET Membership Provider. V příštím díle to bude Custom Membership Provider.

Poznámka na úvod: Některá slovíčka, jako je třeba user name, password, credentials, membership, provider atd., záměrně překládám, většinou je ale ponechávám nepřeložené už z toho důvodu, že mi to tak příjde jasnější. Navíc se často stává, že v konfiguračním souboru se element jmenuje anglicky přesně tak, jak se tato slovíčka normálně píší, proto je většinou nepřekládám.

Autentizace pomocí ASP.NET Membership Provider
ASP.NET Membership Provider je funkce, která umožňuje vývojářům ASP.NET vytvářet webové prezentace, na kterých si mohou uživatelé vytvářet unikátní kombinace přihlašovacích jmen a hesel. Uživatel na takové stránce získá přístup na stránky, na které by se bez přihlášení nedostal. Stejně tak získá přístup ke službám. V tomto je rozdíl od Windows security, protože ta vyžaduje, aby měli uživatelé účty v doméně Windows. Funkce ASP.NET Membership Provider vyžaduje ke svému běhu SQL Server databázi, protože v ní ukládá informace o uživatelích. Rovněž obsahuje mechanismy, díky kterým můžeme jako programátoři pracovat s uživateli, kteří zapomněli své heslo.

Když tuto funkci integrujeme do WCF aplikace, uživatelé budou muset poskytnout své přihlašovací jméno a heslo klientské aplikaci. Klientská aplikace pošle tyto údaje WCF službě přes binding, který podporuje user name/password credentials a zároveň nastaví client credential type na UserName. Tímto je například WSHttpBinding.

Konfigurace membership provideru:
V konfiguračním souboru Web.config pod elementem <system.web> vytvoříme element <membership>. Pod tímto elementem vytvoříme element <providers>. Jeho vložený element bude <clear />. Ten se používá k vyprázdnění kolekce providerů. Pod tímto elementem vytvoříme <add> element, kterému nastavíme následující atributy na hodnoty, které potřebujeme: name, type, connectionStringName, applicationName, enablePasswordRetrieval, enablePasswordReset, requiresQuestionAndAnswer, requiresUniqueEmail, apasswordFormat. Atribut name je použit později jako hodnota v konfiguračním souboru. V následující ukázce konfigurace je nastaven na SqlMembershipProvider.

<!-- Configure the Sql Membership Provider -->
<membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
      <add name="SqlMembershipProvider"
        type="System.Web.Security.SqlMembershipProvider"
        connectionStringName="SqlConn"
        applicationName="MembershipAndRoleProviderSample"
        enablePasswordRetrieval="false"
        enablePasswordReset="false"
        requiresQuestionAndAnswer="false"
        requiresUniqueEmail="true"
        passwordFormat="Hashed" />
  </providers>
</membership> 

Konfigurace security na straně služby tak, aby přijímala kombinaci user name/password:
V konfiguračním souboru pod elementem <system.ServiceModel> přidáme element <bindings>. Následuje element <wsHttpBinding> do sekce bindingů. Nastavíme atribut mode elementu <security> na Message. Nastavíme atribut clientCredentialType elementu <message> na UserName. Toto specifikuje, že pár uživatelského jména a hesla uživatele bude použit jako klientské přihlašovací údaje.

<system.serviceModel>
<bindings>
  <wsHttpBinding>
  <!-- Set up a binding that uses UserName as the client credential type -->
    <binding name="MembershipBinding">
      <security mode ="Message">
        <message clientCredentialType ="UserName"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
</system.serviceModel> 

Konfigurace služby, aby využila membership providera:
Pod elementem <behaviors>, <serviceBehaviors> a <behavior> přidáme element <serviceCredentials>, ke kterému specifikujeme element <userNameAuthentication>. Tomu přidělíme atribut userNamePasswordValidationMode a nastavíme jej na MembershipProvider. Nastavíme ještě atribut membershipProviderName na jméno poskytovatele.

<serviceCredentials>
  <userNameAuthentication userNamePasswordValidationMode ="MembershipProvider"
      membershipProviderName ="SqlMembershipProvider"/>
</serviceCredentials>


Kryštof