2012-03-29 3 views
3

Azureトレーニングキットには、「IntroToACS2」という名前のラボが含まれています。その中で、WebRoleを作成し、ACSを有効にして、Google、Live、またはYahooのIDを使用してログインできるようにします。ラボの第2部では、ACSからログインページのサンプルをダウンロードして、サイトのスタイルに合わせてカスタマイズすることができます。Azure ACSからログインページをダウンロードした後に、返信URLが正しく機能するようにするにはどうすればよいですか?

この最後の部分を実行する前に、ディープリンクが正常に機能していました。意味:私はhttp://localhost/acsdemo/securepage.aspxのような安全なページを要求することができ、ACSはリクエストを傍受し、私をログインページにリダイレクトしてからhttp://localhost/acsdemo/securepage.aspxに返しますが、今度は私をデフォルトページhttp://localhost/acsdemo/default.aspxに返します。

Azure ACSからログインページをダウンロードした後、もう一度ディープリンクを使用する必要がありますか?

答えて

2

securepage.aspxのリターンURLは、通常、ログイン用にリダイレクトするときにコンテキストパラメータに格納されます。 ACSホストログインページとカスタムダウンロード可能ページの両方に、ACSにIDプロバイダリストを照会し、各IPのログインリンクを生成するjavascriptがあります。 ACSがホストするバージョンは、指定されたwctxを収集し、このコンテキストを保存するために各IPログインURLをカスタマイズするという点で特別です。このようにして、ACSは、認証が完了したときにユーザをリダイレクトする場所を認識します。

ただし、ダウンロード可能なカスタムログインページではこのコンテキストが保持されないため、ACSはACS設定で指定したリターンURL(この場合はdefault.aspx)にリダイレクトします。

しかし、この欠落しているパラメータを挿入するようにカスタムログインページを変更できます。ここで問題となるのは、このコンテキストがプロトコルによって異なる方法で伝達されるということです。 LiveID(WS-Federation)の場合、着信wctxは、liveIDログインリンクの発信wctxではなく、ボックス形式の「cx」で再送信できます。以下は、これを実現するCreateIdentityProviderButton()関数に追加したJavaScriptです。ヤフーやグーグル(のOpenID)については

... 

    //Creates a stylized link to an identity provider's login page 
    function CreateIdentityProviderButton(identityProvider) { 

     // Some code I stole from fellow stackoverflow member for extracting query parameters =) 
     var urlParams = {}; 
     (function() { 
       var e, 
        a = /\+/g, // Regex for replacing addition symbol with a space 
        r = /([^&=]+)=?([^&]*)/g, 
        d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, 
        q = window.location.search.substring(1); 

       while (e = r.exec(q)) 
        urlParams[d(e[1])] = d(e[2]); 
      })(); 

     var cx = "&cx=" + encodeURIComponent(urlParams.wctx); 
     var idpList = document.getElementById("IdentityProvidersList"); 
     var button = document.createElement("button"); 
     button.setAttribute("name", identityProvider.Name); 
     button.setAttribute("id", identityProvider.LoginUrl + encodeURIComponent(cx)); 

     ... 

このコンテキストは "コンテキスト" クエリパラメータとして、 openid.return_to で返されます。あなたはACS IdentityProviderに何を参照してくださいアイデンティティプロバイダ名に基づいて、特殊なケースにログインリンクをコードを書くことができ

... openid.return_to=https://youracstenant.accesscontrol.windows.net:443/v2/openid?context=<value of the wctx extracted from javascript above> ... 

:だからあなたのログインページで、あなたは同様にそのようなあなたのログインリンクにopenid.return_toを編集することができます。 js jsonの応答。ここで

+0

私はこれを撮影することに興奮しました。しかし、これらの変更を加えることはやりにくく、実際にはUser.Identity.Nameがnullになり、Thread.CurrentPrincipal.Identity.Nameがnullになる原因となりました。ここ は、カスタムログインページのクエリ文字列にwctxの値である: '&wctx = RM%3D0%26id%3dpassive%26ruの%の3D%252fAccount%252fSettings.aspx' 私はそれだけ含まれている場合があります期待していましたリダイレクトURL。 – barsh

+0

それは価値があるため、私はGoogle IDでテストしています。 @Andrew、あなたの提案は他のアイデンティティプロバイダーのために働くことができると思います。少なくとも私は正しい方向に向かっています。 – barsh

+0

もちろん、ああ。私はあなたにLiveID固有の解決策を与えました。 Googleではうまくいきませんが、私は自分の答えを編集して、ログインリンクの外観を表示しています。 –

2

は、私が働いてディープリンクを得た方法である:

アズールからサンプルのログインページをダウンロードした後、私はその後REPLY_TOアドレスを更新するために、いくつかのC#のコードを追加してLogin.aspxのと呼ばれるaspxページにその内容をコピーしました。

以下に示すようにLogin.aspxの中のスクリプトタグと '& REPLY_TO = <% =にreturnurl%>' への変更 '& REPLY_TOを=' 検索:

<script src="https://sample.accesscontrol.windows.net:443/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=http%3a%2f%2flocalhost%2fSample&reply_to=<%=returnUrl%>&context=&request_id=&version=1.0&callback=ShowSigninPage" type="text/javascript"></script> 

次に、ログインするには、次のコードを追加します.aspx。CS

using System; 
using System.Web; 

namespace Sample 
{ 
    public partial class Login : System.Web.UI.Page 
    { 
     protected string returnUrl = ""; 
     protected void Page_Load(object sender, EventArgs e) 
     {    
      var wctx = Request.QueryString["wctx"]; 
      var wreply = Request.QueryString["wreply"]; 
      if (wctx == null || wreply == null) return; 
      var queryString = HttpUtility.ParseQueryString(wctx); 
      var ru = queryString["ru"]; 
      if (ru == null) return; 
      returnUrl = Server.UrlEncode(wreply + ru); 
     } 
    } 
} 

は、ここにあなたのログインリンク/ボタンを作成する方法である:

それは動作しませんので、このようなリンクを作成しないでください。代わりに

<a href="Login.aspx">Login</a> 

次のような認証後にのみアクセスできるページへのディープリンクを作成します。

<a href="SecurePage.aspx">Login</a> 

私はこれまでのところGoogle IDでこれをテストしましたが、他のIDプロバイダでも動作することが期待されます。

+0

MVCコントローラでコードを使用しましたが、returnUrlは常に空であり、ユーザーはディープURLにリダイレクトされません。私はIDプロバイダとしてGoogleとFacebookを使ってきました。何か案は? – RHAD

関連する問題