如何允许特定角色使用 identityserver3.accesstokenvalidation 访问 API
How to allow specific roles to access API using identityserver3.accesstokenvalidation
我有一个为客户端提供访问令牌的 Identityserver4。
在我的 API 上,我想确保允许客户端访问特定范围并且该用户属于特定角色,然后再授予此用户访问 API.
为此,我正在使用 Identityserver3.accesstokenvalidation 包。
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "Authority",
RequiredScopes = new[] { "MyScope" },
});
这会阻止没有访问令牌的用户访问我的 API,它还会检查提供的范围是否为 "MyScope"。
我的问题是如何在允许访问 API.
之前检查用户是否具有特定角色
您可以为特定控制器放置属性 [Authorize(Roles = "Admin")]
。如果你需要更高级的声明逻辑,你需要指定你自己的属性,例如AuthorizePermissionAttribute
并与控制器 [AuthorizePermission("Preview")]
一起使用:
public class AuthorizePermissionAttribute : AuthorizeAttribute
{
private readonly string grantedPermission;
public AuthorizePermissionAttribute(string permission)
{
this.grantedPermission = permission ?? throw new ArgumentNullException(nameof(permission));
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var claims = actionContext.ControllerContext.RequestContext.Principal as ClaimsPrincipal;
var permission = claims?.FindFirst(this.grantedPermission);
return permission != null && Convert.ToBoolean(permission.Value);
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "insufficient_permissions");
actionContext.Response = response;
}
}
还需要输入Startup.cs:
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = ConfigurationManager.AppSettings["IdentityProviderApi"],
PreserveAccessToken = true
});
没有JwtSecurityTokenHandler.InboundClaimTypeMap
它将return总是未授权状态代码。
我有一个为客户端提供访问令牌的 Identityserver4。
在我的 API 上,我想确保允许客户端访问特定范围并且该用户属于特定角色,然后再授予此用户访问 API.
为此,我正在使用 Identityserver3.accesstokenvalidation 包。
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "Authority",
RequiredScopes = new[] { "MyScope" },
});
这会阻止没有访问令牌的用户访问我的 API,它还会检查提供的范围是否为 "MyScope"。
我的问题是如何在允许访问 API.
之前检查用户是否具有特定角色您可以为特定控制器放置属性 [Authorize(Roles = "Admin")]
。如果你需要更高级的声明逻辑,你需要指定你自己的属性,例如AuthorizePermissionAttribute
并与控制器 [AuthorizePermission("Preview")]
一起使用:
public class AuthorizePermissionAttribute : AuthorizeAttribute
{
private readonly string grantedPermission;
public AuthorizePermissionAttribute(string permission)
{
this.grantedPermission = permission ?? throw new ArgumentNullException(nameof(permission));
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var claims = actionContext.ControllerContext.RequestContext.Principal as ClaimsPrincipal;
var permission = claims?.FindFirst(this.grantedPermission);
return permission != null && Convert.ToBoolean(permission.Value);
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "insufficient_permissions");
actionContext.Response = response;
}
}
还需要输入Startup.cs:
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = ConfigurationManager.AppSettings["IdentityProviderApi"],
PreserveAccessToken = true
});
没有JwtSecurityTokenHandler.InboundClaimTypeMap
它将return总是未授权状态代码。