Sicherheit

In Windows Azure und in Windows Server erfordert Service Bus Zugriffstoken für die Autorisierung des Zugriffs auf seine Entitäten. Da Zugriffssteuerung für Windows Azure Active Directory (auch Zugriffssteuerungsdienst oder ACS) unter Windows Server nicht verfügbar ist, enthält Service Bus for Windows Server einen einfachen Service Bus-Sicherheitstokendienst (SBSTS). Der SBSTS ist in das Windows-Sicherheitsmodell integriert und kann SWT (Simple Web Token) basierend auf Windows-Identitäten ausstellen (die im lokalen Windows-Identitätsspeicher oder in Active Directory gespeichert sind).

Service Bus for Windows Server-Konfiguration

Der SBSTS ist Teil des Service Bus for Windows Server-Gateways und wird auf jedem der Service Bus for Windows Server-Farmhosts ausgeführt. Die SBSTS-Einstellungen werden initialisiert, wenn der Dienstnamespace erstellt wird.

In Service Bus for Windows Server können Autorisierungsregeln an zwei Orten angegeben werden:

  1. Auf der Dienstnamespaceebene von Service Bus for Windows Server gibt ein Administrator eine Liste der Benutzer an, die die Berechtigungen Verwalten, Senden und Empfangen für alle zugrunde liegenden Service Bus-Messagingentitäten (Warteschlangen, Themen und Abonnements) besitzen. Diese Berechtigungen können einem Sicherheitsprinzipal (einem Benutzer oder einer Sicherheitsgruppe) während der Erstellung des Dienstnamespaces erteilt und später mithilfe eines PowerShell-Befehls geändert werden. Weitere Informationen finden Sie unter den Cmdlets New-SBNamespace und Set-SBNamespace.

  2. Auf der Service Bus for Windows Server-Messagingentitätsebene (Warteschlange oder Thema) können Sie Autorisierungsregeln für diese Entität angeben. Die Regel Verwalten steuert, ob der Benutzer Berechtigungen verwalten sowie Entitäten erstellen, ändern oder löschen kann. Die Regel Senden steuert, ob der Benutzer Nachrichten an eine Service Bus for Windows Server-Entität senden kann, und Empfangen steuert, ob der Benutzer Nachrichten von der Service Bus for Windows Server-Entität empfangen kann. Zum Konfigurieren der Zugriffsrechte für eine Entität muss der Administrator Autorisierungsregeln konfigurieren. Für diese Aktion ist die Berechtigung Veralten für den Dienstnamespace erforderlich.

Ein Benutzer mit der Berechtigung Verwalten für den Dienstnamespace kann anschließend Autorisierungsregeln zu den Entitäten im Dienstnamespace hinzufügen. Sobald Sie eine NamespaceManager-Instanz erstellt haben, können Sie z. B. die Autorisierungsregeln hinzufügen, wenn eine Entität erstellt wird, oder Sie können diese für eine vorhandene Entität ändern. Das folgende Beispiel fügt die Autorisierungsregeln beim Erstellen einer Warteschlange hinzu:

// 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);

Im Beispiel oben wurde eine Warteschlange (sourceQ) mit zwei Autorisierungsregeln erstellt: Der Gruppe (MYGroup) werden Verwaltungs- und Sendeberechtigungen erteilt, dem Benutzer (MyUserName) wird Lauschberechtigung erteilt.

Zugriff auf Service Bus for Windows Server

Clients, die auf einen Dienstnamespace oder eine Entität auf dem Computer mit Service Bus for Windows Server zugreifen, müssen für jeden Vorgang ein Token von SBSTS abrufen.

Hinweis

Die Standardlebensdauer für die Token, die SBSTS ausstellt, beträgt 20 Minuten.

Verwenden des Service Bus for Windows Server SDK

Sie können Zugriff auf eine Service Bus-Entität erlangen, indem Sie ein Token von abrufen. Standardmäßig lauscht ein in Service Bus for Windows Server verwendetes $STS an Port 9355.

Clients, die Service Bus for Windows Server verwenden, können einen Tokenanbieter erstellen, der mit ihren NamespaceManager- und MessagingFactory-Klassen verwendet wird. Beispiel:

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) });

Ersetzen Sie im Beispiel oben <hostname> durch den Namen des Servers, der Service Bus for Windows Server hostet. Ersetzen Sie <serviceNamespace> durch den Namen des Dienstnamespaces, auf den Sie zugreifen möchten.

Nachfolgende Vorgänge, die MessagingFactory verwenden, rufen das Token automatisch über das TokenProvider-Objekt ab und schließen es in alle Vorgänge ein. Diese Klasse verwaltet auch die Tokenzwischenspeicherung und -erneuerung basierend auf der Ablaufzeit des Tokens.

Verwenden von HTTP

Das folgende Beispiel zeigt das Abrufen des Zugriffstokens mithilfe von HTTP aus SBSTS. Dieser Dienst ist unter der $STS-Adresse gespeichert.

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

Im diesem Beispiel können Sie die Werte hostname, namespace und username im gezeigten Format ersetzen.

In nachfolgenden Nachrichten an Service Bus for Windows Server kann der Client den HTTP-Autorisierungsheader auf das Token festlegen, das durch den Aufruf der im Beispiel oben gezeigten Methode GetOAuthAccessToken() abgerufen wurde.

Hinweis

Clients, die HTTP verwenden, sind für das Verwalten der Tokenzwischenspeicherung und -erneuerung basierend auf der Ablaufzeit des Tokens verantwortlich.

Builddatum:

2013-07-25