Sicurezza

In Windows Azure e in Windows Server, Service Bus richiede token di accesso per autorizzare l'accesso alle entità. Dal momento che il Access Control di Active Directory di Windows Azure (anche noto come Servizio Access Control o ACS) non è disponibile in Windows Server, Service Bus per Windows Server include un semplice servizio token di sicurezza di Service Bus (SBSTS). Il servizio SBSTS è integrato con il modello di sicurezza di Windows e può emettere token SWT (Simple Web Token) basati su identità di Windows, presenti nell'archivio identità di Windows locale o in Active Directory.

Configurazione di Service Bus per Windows Server

Il servizio SBSTS fa parte del gateway Service Bus per Windows Server e viene eseguito su ogni host della farm di Service Bus per Windows Server. Le impostazioni di SBSTS vengono inizializzate al momento della creazione dello spazio dei nomi del servizio.

Le regole di autorizzazione possono essere specificate in due posizioni in Service Bus per Windows Server:

  1. A livello dello spazio dei nomi del servizio di Service Bus per Windows Server, un amministratore specifica un elenco di utenti che dispongono di autorizzazioni di gestione, invio e ricezione su tutte le entità di messaggistica di Service Bus sottostanti (code, argomenti e sottoscrizioni). Queste autorizzazioni possono essere concesse a un'entità di sicurezza (utente o gruppo di sicurezza) durante la creazione dello spazio dei nomi del servizio e possono essere modificate successivamente utilizzando un comando di PowerShell. Per ulteriori informazioni, vedere i cmdlet New-SBNamespace e Set-SBNamespace.

  2. A livello di entità di messaggistica di Service Bus per Windows Server (coda o argomento), è possibile specificare le regole di autorizzazione per l'entità. La regola Manage controlla se l'utente può gestire le autorizzazioni e creare, modificare o eliminare le entità. La regola Send controlla se l'utente può inviare messaggi a un'entità di Service Bus per Windows Server e Receive controlla se l'utente può ricevere messaggi dall'entità di Service Bus per Windows Server. Per configurare i diritti di accesso per un'entità, è necessario che l'amministratore configuri le regole di autorizzazione. Per questa azione è necessario disporre dell'autorizzazione Manage nello spazio dei nomi del servizio.

Un utente che dispone dell'autorizzazione Manage nello spazio dei nomi del servizio può aggiungere regole di autorizzazione alle entità all'interno dello spazio dei nomi del servizio. Dopo avere creato un'istanza di NamespaceManager, ad esempio, è possibile aggiungere regole di autorizzazione quando viene creata un'entità oppure modificarle in un'entità esistente. Nel seguente esempio le regole di autorizzazione vengono aggiunte al momento della creazione di una coda:

// Example of allowing a domain group manage and send permissions to a queue
QueueDescription sourceQ = new QueueDescription(sourceQName);
string domainGroup = “MyGroup@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN"); 
AuthorizationRule sourceQRule = new AllowRule("owner", RoleClaimType, domainGroup, new List<string>() {"Manage", "Send" });
sourceQ.Authorization.Add(sourceQRule );

// Example of granting a domain user listen permissions to a queue
string domainUser = “MyUserName@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN");
AuthorizationRule ListenRule = new AllowRule("owner", IdentityClaimType, domainUser, new List<string>() { "Listen" });
sourceQ.Authorization.Add(ListenRule);
namespaceManager.CreateQueue(sourceQ);

Nell'esempio precedente è stata creata una coda (sourceQ) con due regole di autorizzazione: concessione delle autorizzazioni di gestione e invio al gruppo (MYGroup) e concessione delle autorizzazioni di attesa all'utente (MyUserName).

Accesso a Service Bus per Windows Server

I client che accedono a uno spazio dei nomi del servizio o a un'entità in Service Bus per Windows Server devono acquisire un token dal servizio SBSTS per qualsiasi operazione.

Nota

La durata predefinita per i token emessi dal servizio SBSTS è 20 minuti.

Utilizzo dell'SDK di Service Bus per Windows Server

È possibile accedere a un'entità di Service Bus ottenendo un token dal servizio token di sicurezza. Per impostazione predefinita, un servizio $STS utilizzato in Service Bus per Windows Server rimane in ascolto sulla porta 9355.

I client che utilizzano Service Bus per Windows Server possono creare un provider di token da utilizzare con le classi NamespaceManager e MessagingFactory, come indicato di seguito:

stsUris= new List<Uri>() { new Uri(string.Format(CultureInfo.InvariantCulture, 
    "sb://{0}:9355/", <hostname>)) };
TokenProvider tokenProvider = TokenProvider.CreateWindowsTokenProvider(stsUris);

string runtimeAddress = string.Format("sb://{0}:9354/{1}/", <hostname>,  
    <serviceNamespace>);
MessagingFactory messagingFactory = MessagingFactory.Create(runtimeAddress, 
    new MessagingFactorySettings() { TokenProvider = this.tokenProvider, 
    OperationTimeout = TimeSpan.FromMinutes(30) });

Nell'esempio precedente sostituire <hostname> con il nome del server che ospita Service Bus per Windows Server. Sostituire <serviceNamespace> con il nome dello spazio dei nomi del servizio a cui si desidera accedere.

Per le successive operazioni che utilizzano MessagingFactory il token verrà automaticamente acquisito tramite l'oggetto TokenProvider e verrà incluso in tutte le operazioni. Questa classe gestisce anche la memorizzazione nella cache e il rinnovo dei token in base alla scadenza dei token.

Utilizzo di HTTP

Nel seguente esempio viene illustrata la procedura di acquisizione del token di accesso mediante HTTP da parte del servizio SBSTS, che si trova nell'indirizzo del servizio $STS.

public static void Usage()
{
    string token = GetOAuthAccessToken(new 
        Uri("https://<hostname.domain.com>:9355/<namespace> /"), 
        "user@corp.domain. com", "<password>", TimeSpan.FromMinutes(10)); 
}

public static string GetOAuthAccessToken(Uri namespaceBaseAddress, string userName, string userPassword, TimeSpan timeout)
{
    const int ServicePointMaxIdleTimeMilliSeconds = 50000;
    const string OAuthTokenServicePath = "$STS/OAuth/";
    const string ClientPasswordFormat = 
        "grant_type=authorization_code&client_id={0}&client_secret={1}&scope={2}";

    Uri requestUri = new Uri(namespaceBaseAddress, OAuthTokenServicePath);
    string requestContent = string.Format(CultureInfo.InvariantCulture, 
        ClientPasswordFormat, HttpUtility.UrlEncode(userName), 
        HttpUtility.UrlEncode(userPassword), 
        HttpUtility.UrlEncode(namespaceBaseAddress.AbsoluteUri));
    byte[] body = Encoding.UTF8.GetBytes(requestContent);

    HttpWebRequest request = WebRequest.Create(requestUri) as HttpWebRequest;
    request.ServicePoint.MaxIdleTime = ServicePointMaxIdleTimeMilliSeconds;
    request.AllowAutoRedirect = true;
    request.MaximumAutomaticRedirections = 1;
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = body.Length;
    request.Timeout = Convert.ToInt32(timeout.TotalMilliseconds, 
        CultureInfo.InvariantCulture);

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(body, 0, body.Length);
    }

    string rawAccessToken = null;
    using (var response = request.GetResponse() as HttpWebResponse)
    {
        using (Stream stream = response.GetResponseStream())
        {
            using (var reader = new StreamReader(stream, Encoding.UTF8))
            {
                rawAccessToken = reader.ReadToEnd();
            }
        }
    }

    string simpleWebToken = string.Format(CultureInfo.InvariantCulture, 
        "WRAP access_token=\"{0}\"", rawAccessToken);
    return simpleWebToken;
}

In questo esempio è possibile sostituire i valori di hostname, namespace e username nel formato indicato.

Nei messaggi successivi a Service Bus per Windows Server il client può impostare l'intestazione di autorizzazione HTTP in base al token ottenuto dalla chiamata al metodo GetOAuthAccessToken() nell'esempio precedente.

Nota

I client che utilizzano HTTP sono responsabili della gestione della memorizzazione nella cache e del rinnovo dei token in base alla scadenza dei token.

Data di compilazione:

2013-07-25