ルート レベルで「testtopic」というトピックを (手動で) 作成しました。ACS Management Service からプログラムで SWT を取得しようとしています。次に、その SWT を使用して「testtopic」トピックにメッセージを送信しようとしています。SWT を取得するには、次のコードを使用します。
var client = new WebClient();
client.BaseAddress = string.Format("https://connectedcloudapps.accesscontrol.windows.net");
var values = new NameValueCollection
{
{"wrap_name", "publisher"},
{"wrap_password", "password"},
{"wrap_scope", "https://connectedcloudapps.servicebus.windows.net/testtopic/"}
};
// WebClient takes care of the URL Encoding
byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values);
string response = Encoding.UTF8.GetString(responseBytes);
var token = HttpUtility.UrlDecode(response
.Split('&')
.Single(value => value.StartsWith("wrap_access_token=",StringComparison.OrdinalIgnoreCase))
.Split('=')[1]);
見返りに SWT を受け取るので、上記は正常に機能します。これまでのところとても良い...私は思う
以下は、サービス ID、ルールなどの構成です。
Service identity
Name: publisher
Type:Password
Effective Date: 4/5/2013
Expiration Date: 4/5/2014
Rule group:
Name: publisherrule
Used by the following relying party applications:publisher rp
Rules (net.windows.servicebus.action):
IF
Input claim issuer: Access Control Service
Input claim type: nameidentifier
Input claim value: publisher
THEN
Output claim type:net.windows.servicebus.action
Output claim value:Send
Relying Party Applications
Name: publisher rp
realm:https://connectedcloudapps.servicebus.windows.net/testtopic
Return URL: <empty>
Error URL: <empty>
Token format: SWT
Token lifetime (secs):600
Authentication Settings
Identity providers:
<No Identity providers selected>
Rule groups:
Select the rule groups to use for this relying party application when processing claims.
'pubishrule' is selected via checkbox
Token Signing Keys:
Service Namespace Symmetric Key
すべてが構成されたら、次を使用します。これは何度も変更しましたが、トピックに送信することはできません。
var tokenProvider = TokenProvider.CreateSimpleWebTokenProvider(token); //token is what was retrieved in above code
var factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", "connectedcloudapps", string.Empty), tokenProvider);
var sender = factory.CreateTopicClient("testtopic");
var msg = new BrokeredMessage("Yahoooooooo");
try
{
sender.Send(msg);
}
私が受け取っているエラーは次のとおりです。
{System.UnauthorizedAccessException: トークン プロバイダーは、' https://connectedcloudapps-sb.accesscontrol.windows.net/WRAPv0.9/ 'へのアクセス中にセキュリティ トークンを提供できませんでした。トークン プロバイダーから返されたメッセージ:「エラー:コード:401:サブコード:T2002:詳細:オーディエンスが無効です。:TraceID:bcd601fc-ac1b-4c23-bd85-67d8aeda83df:TimeStamp:2013-04-07 17:13:58Z」。---> System.IdentityModel.Tokens.SecurityTokenException: トークン プロバイダーは、「https://connectedcloudapps-sb.accesscontrol.windows.net/WRAPv0.9/にアクセスしているときに、セキュリティ トークンを提供できませんでした。'。トークン プロバイダーから返されたメッセージ:「エラー:コード:401:サブコード:T2002:詳細:オーディエンスが無効です。:TraceID:bcd601fc-ac1b-4c23-bd85-67d8aeda83df:TimeStamp:2013-04-07 17:13:58Z」。---> System.Net.WebException: リモート サーバーがエラーを返しました: (401) Unauthorized. System.Net.HttpWebRequest.GetResponse() at Microsoft.ServiceBus.TokenProviderHelper.GetAccessTokenCore(Uri requestUri, String applyTo, String requestToken, String simpleAuthAssertionFormat, TimeSpan timeout, String& expiresIn) --- 内部例外スタック トレースの終わり --- at Microsoft.ServiceBus.TokenProviderHelper.ThrowException (Uri requestUri、WebException 例外) Microsoft.ServiceBus.TokenProviderHelper.GetAccessTokenCore (Uri requestUri、String applyTo、String requestToken、String simpleAuthAssertionFormat、
1 entityType, String transferDestinationEntityName) at Microsoft.ServiceBus.Messaging.Sbmp.CreateSenderLinkSettings..ctor(SbmpMessagingFactory messagingFactory, String entityName, Nullable
1 entityType) Microsoft.ServiceBus.Messaging.Sbmp.SbmpTopicClient.OnBeginCreateSender(TimeSpan timeout, AsyncCallback callback, Object state) at Microsoft.ServiceBus.Messaging.TopicClient.<>c__DisplayClass2.b__0(AsyncCallback c, Object s) at Microsoft.ServiceBus .Messaging.OpenOnceManager.OpenOnceManagerAsyncResult1.BeginOperation() at Microsoft.ServiceBus.Messaging.OpenOnceManager.OpenOnceManagerAsyncResult
1.OpenComplete(IAsyncResult 結果) Microsoft.ServiceBus.Common.AsyncResult.SyncContinue(IAsyncResult) Microsoft.ServiceBus.Messaging.OpenOnceManager.OpenOnceManagerAsyncResult1..ctor(OpenOnceManager openOnceManager, TimeSpan openTimeout, AsyncCallback callback, Object state, Func
3 beginOperation、EndOperation1 endOperation) at Microsoft.ServiceBus.Messaging.OpenOnceManager.Begin[T](AsyncCallback callback, Object state, Func
3 beginOperation、Func`2 endOperation)
Microsoft.ServiceBus.Messaging.TopicClient.BeginCreateSender (TimeSpan タイムアウト、AsyncCallback コールバック、オブジェクト状態) で Microsoft.ServiceBus.Messaging.TopicClient.EnsureCreateInternalSender() で Microsoft.ServiceBus.Messaging.TopicClient.ThrowIfSenderNull (文字列操作名) で Microsoft.ServiceBus .Messaging.TopicClient.Send(BrokeredMessage message) at Console.Program.PostToTopic(Uri uri, String token) in c:\Poc City\AirConCloud\Console\Program.cs:line 56}
結局のところ、非常に多くのサービス ID があり、それぞれが異なるアクセス権を使用してトピックにアクセスする必要があります。
- 上記のアプローチは正しく、配管の細部が欠けているだけですか?
- これは機能せず、再設計が必要ですか?
1 の場合は何が問題なのか、2 の場合はどのように対処すればよいでしょうか。
前もって感謝します