2012-08-01 130 views
2

我有一個運行ASP.Net Web API應用程序的Azure工作者角色。這受ACS保護。當我使用瀏覽器瀏覽網頁api時,我受到ACS的挑戰,無法對Google或LiveId進行身份驗證。當我進行身份驗證時,我可以看到數據。訪問受Azure保護的Web API站點受到來自Metro應用程序的ACS的保護

我想從Win 8 Metro Style應用程序訪問相同的API。我正在嘗試使用WebAuthenticationBroker。

WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
                 WebAuthenticationOptions.None, 
                 new Uri("https://xxxxx.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2fyyyyy.cloudapp.net%2f"), 
                 new Uri("http://yyyyy.cloudapp.net/") 
                 ); 

當我啓動應用程序,它挑戰我既可以通過谷歌或LiveID的作爲之前進行認證。這通過,我得到了一個成功的結果。

然後,我創建使用的HttpClient的API調用:

HttpClient client = new HttpClient(); 
    Uri _baseUri = new Uri("http://yyyyy.cloudapp.net/api/"); 
    client.BaseAddress = _baseUri; 

    var response = client.GetAsync("Values/").Result; 
    var responseBodyAsText = response.Content.ReadAsStringAsync().Result; 

    var ids = JsonConvert.DeserializeObject<IList<int>>(responseBodyAsText); 

這種類型的作品,這似乎是正確導航到URI,但回來的有效載荷是HTML問我登錄而不是我期待的JSON數據。

我已經花了更多的時間在這方面比明智和已經用完了想法!任何人都可以幫忙嗎?

+0

我有同樣的問題。根據所使用的登錄提供程序,響應數據不同。使用facebook,結果是一個很長的字符串,例如:/ v2/facebook?cx = cHI9d3NmZWRlcmF0aW9uJnJtPWh0並使用LiveID的簡稱:net/v2/wsfederation?wa = wsignin1.0。我也很想知道如何從這裏繼續 – 2012-09-18 16:34:40

+0

到目前爲止,我已經發現,Facebook的url需要response_type = token來獲取令牌。假設對其他提供商也是如此 – 2012-09-18 17:22:50

+0

response_type =谷歌代碼 – 2012-09-18 17:23:55

回答

0

調用API時,您不應該在WebAuthenticationResult中重新使用令牌嗎?

var webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, 
     new Uri("https://xxxxx.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2fyyyyy.cloudapp.net%2f"), new Uri("http://yyyyy.cloudapp.net/")); 

var client = new HttpClient(); 
client.DefaultRequestHeaders.Authorization 
     = new AuthenticationHeaderValue("OAuth", webAuthenticationResult.ResponseData); 
+0

我如何從WebAuthenticationResponse獲取令牌? – 2012-08-01 13:00:21

+0

從我理解的令牌應該在ResponseData屬性 – 2012-08-01 13:22:41

+0

這不起作用 - 我回到ResponseData的所有內容是http://yyyyy.cloudapp.net/這有沒有關係這是http不是https? – 2012-08-01 13:26:08

1

WebAuthenticationBroker只會繼續瀏覽直到瀏覽器會加載URL在callbackUri參數中指定的一個。然後它會將最終的網址返回給您,包括任何查詢參數。它從來沒有真正向callbackUri發出請求。

您遇到的問題是,它ACS實現崗位令牌回返回URL(在ACS配置門戶網站指定),這可能是你指定爲callbackUri參數相同的URL WS聯盟協議的AuthenticateAsync方法。

您需要做的是處理該帖子並將請求重定向到callbackUri,但包含令牌的查詢字符串。

我使用的是WebApi和WIF,我有我的callbackUri指定爲http://localhost:3949/api/federationcallback/end,並返回指定爲http://localhost:3949/api/federationcallback的url。這使我可以讓控制器處理帖子,然後使用URL中的令牌重定向。控制器看起來像這樣。

public class FederationcallbackController : ApiController 
{ 
    public HttpResponseMessage Post() 
    { 
     var response = this.Request.CreateResponse(HttpStatusCode.Redirect); 
     response.Headers.Add("Location", "/api/federationcallback/end?acsToken=" + ExtractBootstrapToken()); 

     return response; 
    } 

    protected virtual string ExtractBootstrapToken() 
    { 
     return HttpContext.Current.User.BootstrapToken(); 
    } 
} 

然後我就可以得到這樣的標記:

var authenticateResult = await WebAuthenticationBroker.AuthenticateAsync(
      WebAuthenticationOptions.None, 
      new Uri("https://xyz.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost:3949%2f"), 
      new Uri("http://localhost:3949/api/federationcallback/end")); 

var oauthToken = authenticateResult.ResponseData.Substring(authenticateResult.ResponseData.IndexOf("acsToken=", StringComparison.Ordinal) + 9); 
+0

bootstraptoken方法是什麼? – 2012-09-27 07:10:44

+0

並且ACS是否知道localhost是我的ip而不是localhost作爲ACS的本地主機? – 2012-09-27 07:37:47

+0

BootstrapToken方法是包含在wif.swt NuGet包中的擴展方法。我認爲這是WIF的一部分,因此我之前沒有提到它。 – 2012-09-27 12:32:17