Procedura: usare provider di appartenenza ASP.NET

Il provider di appartenenza ASP.NET è una funzionalità che consente agli sviluppatori di ASP.NET di creare siti Web che consentono agli utenti di creare combinazioni di nome utente e password univoche. Con questa funzionalità qualsiasi utente può stabilire un account nel sito e accedere in modo esclusivo al sito e ai relativi servizi. Si tratta di una funzionalità in contrasto con la protezione di Windows, in base alla quale è necessario che gli utenti dispongano di un account in un dominio Windows. Qualsiasi utente che fornisca le credenziali (ovvero nome utente e password) può usare il sito e i relativi servizi.

Per un'applicazione di esempio, vedere Appartenenza e provider di ruoli. Per informazioni sull'uso della funzionalità del provider di ruoli ASP.NET, vedere Procedura: Usare il provider di ruoli ASP.NET con un servizio.

La funzionalità di appartenenza richiede l'utilizzo di un database SQL Server per archiviare le informazioni utente. La funzionalità include anche metodi per presentare una domanda agli utenti che hanno dimenticato la password.

Gli sviluppatori di Windows Communication Foundation (WCF) possono sfruttare queste funzionalità a scopo di sicurezza. In caso di integrazione in un'applicazione WCF, gli utenti devono fornire una combinazione di nome utente e password all'applicazione client WCF. Per trasferire i dati al servizio WCF, usare un binding che supporta credenziali di nome utente/password, ad esempio WSHttpBinding (nella configurazione, <wsHttpBinding>) e impostare il tipo di credenziale client su UserName. Nel servizio, la sicurezza WCF autentica l'utente sulla base del nome utente e della password, inoltre assegna il ruolo specificato dal ruolo ASP.NET.

Nota

WCF non fornisce metodi per popolare il database con combinazioni di nome utente/password o altre informazioni utente.

Per configurare il provider di appartenenza

  1. Nel file Web.config, sotto l'elemento <system.web>, creare un elemento <membership>.

  2. Sotto l'elemento <membership>, creare un elemento <providers>.

  3. Come figlio dell'elemento <providers>, aggiungere un elemento <clear /> per scaricare la raccolta di provider.

  4. Sotto l'elemento <clear />, creare un elemento <add> con gli attributi seguenti impostati sui valori appropriati: name, type, connectionStringName, applicationName, enablePasswordRetrieval, enablePasswordReset, requiresQuestionAndAnswer, requiresUniqueEmail e passwordFormat. L'attributo name viene utilizzato in seguito come valore nel file di configurazione. Nell'esempio seguente viene impostato su SqlMembershipProvider.

    Nell'esempio che segue viene illustrata la sezione di configurazione.

    <!-- 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>
    

Per configurare la sicurezza del servizio per accettare la combinazione di nome utente/password

  1. Nel file di configurazione, sotto l'elemento <system.serviceModel>, aggiungere un elemento <bindings>.

  2. Aggiungere <wsHttpBinding> alla sezione binding. Per altre informazioni sulla creazione di un elemento di binding WCF, vedere Procedura: Specificare un binding al servizio nella configurazione.

  3. Impostare l'attributo mode dell'elemento <security> su Message.

  4. Impostare l'attributo clientCredentialType dell'elemento <message> su UserName. Viene in questo modo specificato che un nome utente e una password saranno utilizzati come credenziale del client.

    Nell'esempio seguente viene illustrato il codice di configurazione per l'associazione.

    <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>
    

Per configurare un servizio affinché utilizzi il provider di appartenenza

  1. Come elemento figlio dell'elemento <system.serviceModel>, aggiungere un elemento <behaviors>

  2. Aggiungere un oggetto <serviceBehaviors> all'elemento <behaviors>.

  3. Aggiungere un elemento <behavior> e impostare l'attributo name su un valore appropriato.

  4. Aggiungere un elemento <serviceCredentials> all'elemento <behavior>.

  5. Aggiungere <userNameAuthentication> all'elemento <serviceCredentials>.

  6. Impostare l'attributo userNamePasswordValidationMode su MembershipProvider.

    Importante

    Se il valore userNamePasswordValidationMode non è impostato, WCF usa l'autenticazione di Windows anziché il provider di appartenenze ASP.NET.

  7. Impostare l'attributo membershipProviderName sul nome del provider (specificato al momento di aggiungere il provider nella prima procedura in questo argomento). Nell'esempio seguente viene illustrato il frammento <serviceCredentials> fino a questo punto.

    <behaviors>
       <serviceBehaviors>
          <behavior name="MyServiceBehavior">
             <serviceCredentials>
                <userNameAuthentication
                userNamePasswordValidationMode="MembershipProvider"
                membershipProviderName="SqlMembershipProvider" />
             </serviceCredentials>
          </behavior>
       </serviceBehaviors>
    </behaviors>
    

Esempio

Nel codice seguente viene mostrata la configurazione per un servizio che utilizza la funzionalità di appartenenza ASP.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceBehavior" name="Microsoft.Samples.GettingStarted.CalculatorService">
        <endpoint address="http://microsoft.com/WCFservices/Calculator"
          binding="wsHttpBinding" bindingConfiguration="MembershipBinding"
          name="ASPmemberUserName" contract="Microsoft.Samples.GettingStarted.ICalculator" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceCredentials>
            <userNameAuthentication
              userNamePasswordValidationMode="MembershipProvider"
              membershipProviderName="SqlMembershipProvider" />
          </serviceCredentials>
        </behavior>
          </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="MembershipBinding">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

Vedi anche