IdentityServer3トークンプロバイダによって発行されたトークンを使用するWebAPI 2プロジェクトがあります。私のStartup.csファイルでは、IdentityServerBearerTokenAuthorizationミドルウェアが実装されており、グローバルAuthorizateAttributeフィルタとともに、有効なトークンが要求に存在することを要求しています。しかし、ClaimsTransformationを追加して、暗黙のフローを使用して発行されたトークンまたはクライアントの資格フローのために発行されたトークンのいずれかで、クレームから「ロール」を抽出できます。スコープを使用することはできません。なぜなら、1つのスコープでAPIを使用できるようになっていますが、すべてのクライアントがすべてのAPIエンドポイントを使用することができないからです。私APIController操作でIdentityServer3ベアラトークンでWebAPI認可属性が呼び出されない
Startup.cs
JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions()
{
Authority = ConfigurationManager.AppSettings["IdentityServer"],
RequiredScopes = new[] { "my.api" },
});
httpConfig.MapHttpAttributeRoutes();
httpConfig.Filters.Add(new AuthorizeAttribute());
//SwaggerConfig.Register(httpConfig);
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(httpConfig);
app.UseWebApi(httpConfig);
app.UseClaimsTransformation(identity =>
{
var principal = new ClaimsPrincipal(identity);
if (!identity.HasClaim(c => c.Type == "name") && identity.HasClaim(c => c.Type == "client_name"))
{
identity.Identities.First().AddClaim(new Claim("name", identity.Claims.First(c => c.Type == "client_name").Value));
}
//we want to remove the client_ from the claims so we can evaluate clients like they are users
if (identity.Claims.Any(c => c.Type.Contains("client_")))
{
foreach (var claim in identity.Claims.Where(c => c.Type.Contains("client_")))
{
var newClaimType = claim.Type.Replace("client_", "");
identity.Identities.First().AddClaim(new Claim(newClaimType, claim.Value));
}
}
//set the scopes as roles also
if (identity.Claims.Any(c => c.Type == "scope"))
{
identity.Identities.First().AddClaims(identity.Claims.Where(c => c.Type == "scope").Select(c => new Claim("role", c.Value)));
}
return Task.FromResult(principal);
});
、私は定義された役割のプロパティと承認の属性を持っています。グローバルなAuthorize属性は機能していますが、役割のチェックは行われません。何か不足していますか? \ APIコントローラ
[HttpDelete]
[Authorize(Roles = "item.deleter")]
[Route("{itemId:guid}")]
public async Task<HttpResponseMessage> DeleteAsync([ValidGuid] Guid itemId)
{
_log.Audit.Info($"Received Delete request for item {itemId} from user {User.Identity?.Name}.");
if (!ModelState.IsValid)
....
前
UseClaimsTransformation
を移動してみてください。実際、何が起きているのかを知るために独自の属性を作成しましたが、どちらも当てはまりません(Authorizeから継承していますので、次の試みはASP.NET Identityワークフローから完全に抜け出すことを継承しません) 。グローバルなauthorize属性を持ち、それをメソッドからオーバーライドすることに関する既知の問題はありますか?私の理解は、それがAND型操作として扱われるということです。 – Mike