アクセストークンを要求するためにアイデンティティサーバー3のローカルインスタンスを指しているテストコンソールアプリケーションがあります。次のコードはこれを行い、(スコープ"scope.test.client"
を1つ渡して)細かいトークンを返します。Identity Server 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" }
});
});
私の上書きの最初の行、
GlobalConfiguration.Configuration.Filters.Add(new DefaultApiAuthorizeAttribute());
このAPIのデバッグ:
また、すべてのAPIリクエストが属性を承認カスタムによって処理されることを保証します
var caller = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal;
私はこの行でブレークした場合、私はactionContext.RequestContext.Principal
は常にnullであることがわかります(DefaultApiAuthorizeAttribute
中)方法がこれです。しかし、私は((System.Web.Http.Owin.OwinHttpRequestContext)actionContext.RequestContext).Request.Headers
に私のコンソールアプリケーションから渡されたベアラトークンを持つAuthorizationヘッダーが含まれていることがわかります。
APIプロジェクトがベアラトークンを認証していないようです。確かに、アイデンティティ・サーバーのログには、最初のアクセス・トークンを発行した後にヒットしていないことが示唆されます。だから、なぜこれが起こっていないのか、少なくともどこを見るべきかについての専門家のアドバイスに感謝します。
SSLと何か関係があると思われます。 Identity ServerはSSLを必要としないように設定されており、署名にはidsrv3test.pfx開発証明書を使用しますが、どちらのサイトも自己署名SSL証明書でローカルにホストされています。私はローカルで正常に動作する同じIS3インスタンスに認証を委譲する別のテストMVC Webアプリケーションを持っているので、IS3インスタンスが正しく構成されていると信じています。
Good find。何が起こっているか説明するために戻ってきてくれてありがとう。 –