2016-05-27 4 views
3

Azure ADのセキュリティ保護されたアプリケーションをv2.0エンドポイントに移行します。Microsoft.Owin.Security.OpenIdConnectとAzureAD v 2.0エンドポイントのカスタムパラメータ

返信uriにカスタムパラメータを渡す必要があります。以前のAzure ADエンドポイントでは、通常のクエリパラメータを返信URLに追加していました。 e.g. https://myserver.com/myredirect_uri?mycustomparamerter=myvalue

は残念ながら、エンドポイント2.0と私は返事はURIが登録されたものと一致しないというエラーを受け取りました。もちろん、私のカスタムパラメータ値は動的で、私はそれをハードコードすることはできません。

私は 'state'パラメータdescribed in OAUTH flowを利用しようとしていました。しかし、I am using Microsoft.Owin.Security.OpenIdConnectと私はそれを悪用することはできませんので、パラメータが既に設定されて見えます。 this sampleのようなMVCに基づくフローの実装を使用しています。

私のサーバーが、フローの開始時に設定された返信用のURLにカスタムパラメータを受け取れるように、回避策を提案できますか?

+0

ここで尋ねられました:https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/14758953-support-query-parameters-in-reply-urls-with-azure –

答えて

3

あなたが求めているが、あなたが技術的に注入し、認証フローを余分な値を取り出すことができ一つの方法は、OWINの通知経由で何をする公式の方法がありますかどうかわかりません。 Startup.Auth.csで

、ときに、セットアップあなたは以下を追加したいOpenIdConnectAuthenticationOptions:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions 
    { 
    //... 
    Notifications = new OpenIdConnectAuthenticationNotifications 
    { 
     RedirectToIdentityProvider = OnRedirectToIdentityProvider, 
     MessageReceived = OnMessageReceived 
    }, 
    }); 

そして、あなたのパラメータを注入するための線に沿って何かRedirectToIdentityProviderを使用します。

private Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification) 
{ 
    var stateQueryString = notification.ProtocolMessage.State.Split('='); 
    var protectedState = stateQueryString[1]; 
    var state = notification.Options.StateDataFormat.Unprotect(protectedState); 
    state.Dictionary.Add("mycustomparameter", "myvalue"); 
    notification.ProtocolMessage.State = stateQueryString[0] + "=" + notification.Options.StateDataFormat.Protect(state); 
    return Task.FromResult(0); 
} 

次に、MessageReceivedを使用してメッセージを抽出します。

private Task OnMessageReceived(MessageReceivedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification) 
{ 
    string mycustomparameter; 
    var protectedState = notification.ProtocolMessage.State.Split('=')[1]; 
    var state = notification.Options.StateDataFormat.Unprotect(protectedState); 
    state.Dictionary.TryGetValue("mycustomparameter", out mycustomparameter); 
    return Task.FromResult(0); 
} 

あなたは明らかにこれを改善する必要があるでしょうが、これによりより良い全体的なアプローチができなくなります。

+0

ありがとう君は。私はこれを調べます。 –

+0

これは動作しますが、これは私たちの流れを複雑にします。 OpenIdConnectとOAUTH仕様では、クエリパラメータを使用した返信URLを許可するかどうかは不明です。私はこれをサポートするようにMicrosoftに依頼したいと思います。 –

+0

リダイレクトuriは明示的に削除されています。状態変数は、http://www.thread-safe.com/2014/05/the-correct-use-of-によると、このすべてを入れるはずのものです。 state-parameter-in.html –

関連する問題