gpt4 book ai didi

c# - 未使用 IdentityServer3 持有者 token 调用 WebAPI 授权属性

转载 作者:行者123 更新时间:2023-11-30 12:22:00 25 4
gpt4 key购买 nike

我有一个 WebAPI 2 项目,它使用由 IdentityServer3 token 提供商颁发的 token 。在我的 Startup.cs 文件中,我实现了 IdentityServerBearerTokenAuthorization 中间件,它与全局 AuthorizateAttribute 过滤器一起要求请求中存在有效 token 。但是,我还添加了 ClaimsTransformation,因此我可以从使用隐式流发布的 token 或为客户端凭证流发布的 token 中的声明中提取“角色”。我不能在这里使用范围,因为我有 1 个范围可以让您访问我的 API,但不允许所有客户端使用所有 api 端点。

启动.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);
});

在我的 APIController 操作中,我有一个 Authorize 属性,其中定义了一个 Roles 属性。全局 Authorize 属性正在工作,但对角色的检查从未发生。我错过了什么吗?\API Controller

    [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)
....

最佳答案

您的 authroize 属性很可能在您的声明转换触发之前触发。

在您的 owin 管道中,您在声明转换之前添加了 webAPI。当您的请求沿着管道传输时,Web API 将获取请求并在声明转换可以发挥作用之前对其运行授权。

尝试将 UseClaimsTransformation 移到 UseWebApi 之前

关于c# - 未使用 IdentityServer3 持有者 token 调用 WebAPI 授权属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43011980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com