Share via


セキュリティ

Windows Azure および Windows Server の両方で、Service Bus は、そのエンティティへのアクセスを認証するためにアクセス トークンを要求します。Windows Azure Active Directory アクセス制御 (アクセス制御サービスまたは ACS) が Windows Server で使用できないため、Service Bus for Windows Server は単純な Service Bus セキュリティ トークン サービス (SBSTS) を含んでいます。SBSTS は Windows セキュリティ モデルと統合されており、Windows ID (ローカルの Windows ID ストアまたは Active Directory に格納されています) に基づいて Simple Web Token (SWT) を発行できます。

Service Bus for Windows Server の構成

SBSTS は Service Bus for Windows Server ゲートウェイの一部で、各 Service Bus for Windows Server ファーム ホスト上で実行されます。サービスの名前空間 の作成時に SBSTS 設定が初期化されます。

Service Bus for Windows Server 内で承認規則を指定できる箇所は 2 つあります。

  1. Service Bus for Windows Server サービスの名前空間 レベルでは、管理者は、基盤となるすべての Service Bus メッセージング エンティティ (キュー、トピック、およびサブスクリプション) に対して managesend、および receive アクセス許可を持つユーザーのリストを指定します。これらのアクセス許可は、サービスの名前空間 の作成時にセキュリティ プリンシパル (ユーザーまたはセキュリティ グループ) に付与することができ、後で PowerShell コマンドを使用して変更することができます。詳細については、次のトピックを参照してください。 New-SBNamespace および Set-SBNamespace コマンドレット。

  2. Service Bus for Windows Server メッセージング エンティティ レベル (キューまたはトピック) では、そのエンティティの承認規則を指定できます。Manage 規則は、ユーザーがアクセス許可を管理できると共に、エンティティを作成、変更、または削除できるかどうかを制御します。Send 規則は、ユーザーが Service Bus for Windows Server エンティティにメッセージを送信できるかどうかを制御します。Receive は、ユーザーが Service Bus for Windows Server エンティティからメッセージを受信できるかどうかを制御します。エンティティのアクセス権を構成するには、管理者が承認規則を構成する必要があります。このアクションには、サービスの名前空間 上の Manage アクセス許可が必要です。

サービスの名前空間 上で Manage アクセス許可を持つユーザーは、サービスの名前空間 内のエンティティに承認規則を追加できます。たとえば、NamespaceManager インスタンスを作成したら、承認規則は、エンティティの作成時に追加するか、既存のエンティティで変更することができます。次の例では、キューの作成時に承認規則を追加します。

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

前の例では、次の 2 つの承認規則を持つキュー (sourceQ) を作成しました。グループ (MYGroup) への Manage および Send アクセス許可の付与と、ユーザー (MyUserName) への Listen アクセス許可の付与です。

Service Bus for Windows Server へのアクセス

Service Bus for Windows Server 上の サービスの名前空間 またはエンティティにアクセスするクライアントは、任意の操作を実行するために、SBSTS からトークンを取得する必要があります。

注意

SBSTS が発行するトークンの既定の寿命は 20 分です。

Service Bus for Windows Server SDK の使用

STS からトークンを取得することにより、Service Bus エンティティにアクセスすることが可能になります。既定では、Service Bus for Windows Server で使用される $STS は、ポート 9355 をリッスンします。

Service Bus for Windows Server を使用するクライアントは、NamespaceManager クラスおよび MessagingFactory クラスで使用するトークン プロバイダーを作成できます。次に例を示します。

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

前の例で、Service Bus for Windows Server をホストするサーバーの名前で <hostname> を置き換えます。アクセスする サービスの名前空間 の名前で <serviceNamespace> を置き換えます。

MessagingFactory を使用する以降の操作では、TokenProvider オブジェクトを通じてトークンを自動的に取得し、このトークンをすべての操作に含めます。このクラスは、トークンの有効期限に基づいてトークンのキャッシュと更新も管理します。

HTTP の使用

次の例は、HTTP を使用して $STS アドレスに存在する SBSTS からアクセス トークンを取得する方法を示しています。

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

この例で、hostnamenamespace、および username の各値を表示された書式で置換できます。

Service Bus for Windows Server への以降のメッセージでは、クライアントは HTTP Authorization ヘッダーを、前の例で GetOAuthAccessToken() メソッドの呼び出しから取得したトークンに設定できます。

注意

HTTP を使用するクライアントは、トークンの有効期限に基づいてトークのキャッシュと更新を管理する役割を担います。

ビルド日:

2013-07-25