2016-10-08 17 views
0

私はWebフォームアプリケーションにIdentityServer3を使用していますので、MVC No Library Clientの次のローカルマシンでid_tokenの取得を再現できました。私の完全なソースはGitHubにIdServer3-WebFormsAppDemoとして掲載されています。「実動」サーバに設定されていないクッキー

しかし、実際のプロダクションサーバーに移動すると、アプリはクレームを設定できないようです。アプリが別のフォームにリダイレクトし、id_token特許請求の範囲を表示し、トークン検証、クッキー記号後

// AuthorizationCallback.aspx 
private async Task ProcessRequest() { 
    var idToken = Request.Form["id_token"]; 
    var state = Request.Form["state"]; 

    if (idToken == null) { 
     throw new InvalidOperationException("invalid id_token"); 
    } 

    var claims = await ValidateIdentityTokenAsync(idToken, state); 
    var claimsIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 
    claimsIdentity.AddClaim(new Claim("id_token", idToken)); 
    Request.GetOwinContext().Authentication.SignIn(claimsIdentity); 

    Response.Redirect("/"); 
} 

:これは、(ユーザーが認証および同意を与えた直後)にクッキー記号を処理するコールバックである

私はトークンが AuthorizationCallback.aspxに正常に検証されており、Pからテスト時ローカルしかし全くテストないとき特許請求の範囲が表示されている Default.aspxのにリダイレクトする場合の請求項は、取得されていることを確認することができる
// Default.aspx 
protected void Page_Load (object sender, EventArgs e) { 
    heading.InnerText = Page.User.Identity.IsAuthenticated ? "User Is Authenticated" : "User Is Not Authenticated"; 
    foreach (var claim in Request.GetOwinContext().Authentication.User.Claims) { 
    AddListElement(claim.Type, claim.Value); 
    } 
} 

ローワーサーバ。

Page.User.Identity.IsAuthenticatedは常に偽になり、そして何も保存されたクレームは、ユーザーオブジェクトはありません。私のブラウザから検査すると、私はレスポンスヘッダ上のこれらの2枚のクッキーを見ることができます:

set-cookie:.AspNet.TempCookie=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT 
set-cookie:.AspNet.ApplicationCookie=fyMP9H ... Gt-7VlTA; path=/; secure; HttpOnly 

しかし、本番サーバーでは、ローカルホストからアプリをテストするこれらのクッキーが存在しない場合のみです。この現象の原因は何ですか?どのような助けや手がかりをいただければ幸いです。

答えて

0

問題の原因を見つけたようです。それは私が私のために働い主張を得ることができた非同期リクエストを処理しないようにフォームを変更することにより

// AuthorizationCallback.aspx.cs 
protected void Page_Load (object sender, EventArgs e) { 
    // Needed in order to process ValidateIdentityTokenAsync below 
    RegisterAsyncTask(new PageAsyncTask(ProcessRequest)); 
} 

private async Task ProcessRequest() { 
    var idToken = Request.Form["id_token"]; 
    ... 
    var claims = await ValidateIdentityTokenAsync(idToken, state); 
    ... 
} 

:それは非同期メソッドを処理することができるように私のAuthorizationCallback.aspxフォームが設​​定されていた

protected void Page_Load (object sender, EventArgs e) { 
    var idToken = Request.Form["id_token"]; 
    ... 
    var task = Task.Run(async() => 
     await ValidateIdentityTokenAsync(idToken, state) 
    ); 
    var claims = task.Result; 
    .... 
} 

この変更がなぜ私の問題を解決したのかまだ分かりませんが、SignInの前に非同期メソッドを終了する必要があると思います。今私はブロッキングルーチンを持っているので、もう問題はありません。

関連する問題