我有一个测试控制台应用程序,我指向Identity Server 3的本地实例请求访问令牌。下面的代码执行此操作并返回我的令牌fine(传递单个作用域
"scope.test.client"
).
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" }
});
});
GlobalConfiguration.Configuration.Filters.Add(new DefaultApiAuthorizeAttribute());
OnAuthorize
方法(in
DefaultApiAuthorizeAttribute
var caller = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal;
如果我在这条线上突破,我可以看到
actionContext.RequestContext.Principal
始终为空。然而,我可以看到
((System.Web.Http.Owin.OwinHttpRequestContext)actionContext.RequestContext).Request.Headers
因此,API项目似乎没有对承载令牌进行身份验证。当然,Identity Server日志表明,在发出初始访问令牌后,它根本没有受到攻击。所以我很感激你的专家建议,关于为什么这可能不会发生,或者至少一些关于在哪里寻找的指针。
我怀疑这可能与SSL有关。虽然Identity Server配置为不需要SSL并使用idsrv3test,但这两个站点都在自签名SSL证书下本地托管。pfx开发证书供签署。我确实有另一个测试MVC web应用程序,它将身份验证委托给同一个IS3实例,该实例在本地运行良好,因此我相信我的IS3实例配置正确。