我有一個測試控制檯應用程序,我正在指向身份服務器3的本地實例以請求訪問令牌。以下代碼執行此操作並返回我的令牌(通過單個範圍"scope.test.client"
)。使用身份服務器3,ClaimsPrinciple即使在成功承載令牌身份驗證之後爲null
static TokenResponse GetClientToken(string clientId, string clientSecret, string[] scopes)
{
var uri = new Uri(string.Concat(ID_BASE_URI, ID_URL_TOKEN));
var client = new TokenClient(
uri.AbsoluteUri,
clientId,
clientSecret);
return client.RequestClientCredentialsAsync(string.Join(" ", scopes)).Result;
然後我使用這個標記來調用一個也在本地運行的API。這需要上面得到的,它傳遞給這個方法的TokenResponse
:
static void CallApi(string url, TokenResponse response)
{
try
{
using (var client = new HttpClient())
{
client.SetBearerToken(response.AccessToken);
Console.WriteLine(client.GetStringAsync(url).Result);
}
}
catch (Exception x)
{
Console.WriteLine(string.Format("Exception: {0}", x.Message));
}
}
的API(一個ASP.NET的WebAPI項目)使用Owin啓動類執行承載令牌認證的所有要求:
appBuilder.Map(baseApiUrl, inner =>
{
inner.UseWebApi(GlobalConfiguration.Configuration);
// Enforce bearer token authentication for all API requests
inner.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://identityserver/core",
ValidationMode = ValidationMode.ValidationEndpoint,
RequiredScopes = new[] { "scope.test.client" }
});
});
它還確保所有API請求由自定義授權屬性處理:
GlobalConfiguration.Configuration.Filters.Add(new DefaultApiAuthorizeAttribute());
調試這個API,第一行中我覆蓋OnAuthorize
方法(在DefaultApiAuthorizeAttribute
)是這樣的:
var caller = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal;
如果我在這條線斷,我可以看到actionContext.RequestContext.Principal
總是空。但是,我可以看到((System.Web.Http.Owin.OwinHttpRequestContext)actionContext.RequestContext).Request.Headers
包含一個Authorization標頭,其中帶有從我的控制檯應用程序傳遞的不記名標記。
所以它似乎是在API項目未認證令牌承載。當然,Identity Server日誌表明它在發出初始訪問令牌後根本沒有被擊中。所以我會很感激你的專家建議,說明爲什麼這可能不會發生,或者至少是關於在哪裏尋找的一些指示。
我懷疑它可能有一些做SSL。儘管Identity Server被配置爲不需要SSL並使用idsrv3test.pfx開發證書進行簽名,但兩個站點均在自簽名SSL證書下進行本地託管。我確實有另一個測試MVC web應用程序,它將身份驗證委託給本地正常工作的相同IS3實例,所以我相信我的IS3實例配置正確。
好的發現。感謝您回來解釋發生了什麼。 –