2017-05-24 43 views
0

我瀏覽了有關使用Oauth保護在線Azure活動目錄中的WebAPI的所有教程。但不幸的是,他們都不能工作。使用Oauth保護帶有Azure活動目錄的WebAPI

我正在使用VS 2017,我的項目是.net核心。

到目前爲止,我曾嘗試是:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    ervices.AddAuthentication(); // -----------> newly added 
} 

在 「配置」,我說:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAD:Tenant"]), 
    Audience = Configuration["AzureAd:Audience"],   
}); 

這裏是我的配置:

"AzureAd": { 
    "AadInstance": "https://login.microsoftonline.com/{0}", 
    "Tenant": "tenantname.onmicrosoft.com", 
    "Audience": "https://tenantname.onmicrosoft.com/webapiservice" 
    } 

我已經註冊了這個在我的AAD上的「webapiservice」(鏈接是:http://webapiservice.azurewebsites.net)。

此外,爲了訪問此web api服務,我創建了一個webapi客戶端「webapiclient」,它也是一個web api,並且在我的AAD上註冊並請求訪問「webapiservice」的權限。該客戶端的WebAPI鏈接:http://webapiclient.azurewebsites.net

HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://webapiservice.azurewebsites.net/"); 
//is this uri correct? should it be the link of webapi service or the one of webapi client? 

HttpResponseMessage response = client.GetAsync("api/values").Result; 
if (response.IsSuccessStatusCode) 
{ 
    var result = response.Content.ReadAsAsync<IEnumerable<string>>().Result; 
    return result; 
} 
else 
{ 
    return new string[] { "Something wrong" }; 
} 

所以從理論上講,我應該從webapiservice得到正確的結果。但我總是收到「有問題」。

我在這裏錯過了什麼嗎?

+0

您是不是將身份驗證令牌添加到請求? – juunas

+0

這是什麼意思?是不是由AAD管理? – derek

+1

您的應用必須獲取它。它可以使用各種方式來做到這一點,例如它可以使用客戶端ID和祕密來向AAD證明它是這個應用程序,並且需要該API的令牌。然後AAD會給你一個令牌,讓你可以附加請求。 – juunas

回答

0

你需要從Azure的AD的訪問令牌

有很多在GitHub上很好的例子應用,這裏是一個守護程序應用程序:https://github.com/Azure-Samples/active-directory-dotnet-daemon/blob/master/TodoListDaemon/Program.cs#L96

AuthenticationResult authResult = await authContext.AcquireTokenAsync(todoListResourceId, clientCredential); 

這個程序獲取一個訪問令牌,其客戶端ID和客戶端祕密的API。你可以在你的案例中採用類似的方法。例如,您可以將todoListResourceId替換爲Azure AD Graph API的"https://graph.windows.net/",或者替換Microsoft Graph API的"https://graph.microsoft.com/"。這是您需要令牌的API的標識符。

這是它在AAD中的工作方式。你想要訪問API,你需要從AAD訪問。在一個成功的響應你會得到一個訪問令牌,你必須附加到HTTP調用作爲標題:

Authorization: Bearer accesstokengoeshere...... 

現在,如果你正在構建一個Web應用程序,你可能反而要以不同的方式做到這一點,因爲您現在正在以客戶端應用程序的身份訪問API,而不是用戶。如果您想撥打委託電話,則需要使用例如授權碼流,您向用戶顯示瀏覽器,將其重定向到正確的地址,然後將它們發送回您的應用程序進行登錄。

0

要調用由蔚藍廣告受保護的web API,你應該使用的承載方案通過在授權頭這獲得訪問令牌:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); 
+0

您想詳細闡述一下嗎?如何在你的例子中獲得「authResult」? – derek

+0

您可以在azure廣告中使用openid connect/oauth2.0身份驗證協議來獲取由AAD保護的資源的訪問令牌,請查看[Azure AD的身份驗證方案](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-scenarios)和[這些代碼示例](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-代碼樣本)。 –