2015-05-14 75 views
3

正常OpenIDConnect服務器的工作原理是當請求:完全OpenIDConnect身份驗證通過Ajax

  • 你去a.com/secure-resource
  • 您從服務器
  • 您的瀏覽器處理它,併發送你的得到302回身份服務器
  • 您在那裏登錄
  • 它通過POST
  • 012將您送回
  • 您在a.com上登錄並在您的瀏覽器中獲得a.com/secure-resource

但是我有一個場景,我試圖解決,但我需要你的幫助。

  • 用戶已經登錄在idServer
  • 用戶登錄在a.com
  • 用戶沒有登錄在b.com
  • 我們需要發送一個AJAX調用Web服務器b.com(從另一個域a.com
  • b.com被配置爲使用OpenIDConnect。
  • 但由於b.com的請求是通過Ajax發送的,用戶無法正常重定向到idServer。 (所有我們得到的迴應是302

我們可以繼續和通過Ajax處理302(我還不確定這是否會工作,安全方面)。

是否有專爲這些情況在IdentityServer/OpenIDConnect任何情況下?

回答

3

隨着IdentityServer在這種情況下,您設置服務器b.com使用承載令牌身份驗證,那麼就需要使用你的Ajax的頭部提供a.com的訪問令牌調用

$.ajax({ 
    url: 'http://b.com', 
    headers: { 
      Authorization: "Bearer " + Your Access Token 
     } 
    }) 

JavaScript的IdentityServer客戶端樣品必須從身份服務器檢索令牌的方式,see here

在控制器,你可以得到用戶和令牌這樣

// Get the claims values 
var token= (User as ClaimsPrincipal).Claims 
       .Where(c => c.Type == "access_token") 
       .Select(c => c.Value).SingleOrDefault(); 

在你的應用程序的其他部分,你可以使用這個

//Get the current claims principal 
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal; 

// Get the claims values 
var token = identity.Claims.Where(c => c.Type == "accept_token") 
       .Select(c => c.Value).SingleOrDefault(); 
+0

有希望的答案!唯一的事情是'a.com'在服務器端對用戶進行身份驗證(而不是通過javascript)。有沒有辦法讓令牌在那裏?你是否建議讓a.com服務器將它的標記寫入cookie以供JavaScript拾取? –

+1

是的,服務器'a.com'可以將它存儲到一個餅乾 – Martin

+0

真棒,但怎麼可以'一個。com在認證期間攔截令牌? (我在OWIN中做的) –