我的微服务将以两种方式调用: 1. 由公共网站的未经身份验证的用户调用。2. 通过内部 UI 的经过身份验证的用户来执行管理功能。
我计划使用 OIDC 和 JWT 令牌来验证管理员用户从管理 UI 发出的 API 调用。该令牌中将包含声明,微服务将使用该声明来确定用户是否有权访问此 API。
我计划使用面向公众的网站上的 API 密钥来进行未经身份验证的用户进行的 API 调用。微服务将验证 API 请求标头中的 API 密钥,以确定 API 调用是否来自可信来源。
问题
我正在查看 GCP 控制面板中的 IAM 服务帐户选项卡。我正在编辑服务帐户。我单击“授予访问权限”,输入我正在创建的服务帐户的电子邮件,并尝试添加存储管理员。
但是,列表中没有这样的选项。
此外,通过 CLI 执行此操作的看似等效的尝试失败了:
gcloud projects add-iam-policy-binding my-project-id \
--member='serviceAccount:github-actions@my-project-id.iam.gserviceaccount.com' \
--role='projects/my-project-id/roles/storage.admin'
ERROR: Policy modification failed. For a binding with condition, run "gcloud alpha iam policies lint-condition" to identify issues in condition.
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Role (projects/my-project-id/roles/storage.admin) does not exist in the resource's hierarchy.
Run Code Online (Sandbox Code Playgroud)
显然,我无法理解服务帐户应该如何被授予角色。
authorization role-base-authorization google-cloud-storage google-cloud-platform google-iam
在我的工作中,我的任务是搜索并找到解决方案,以在 monorepo 中组织的微服务中实施 ABAC 授权。我们有一些产品,我们使用领域的概念在同一数据库中组织不同客户端的数据。我们的要求可能是:
首先,我想构建一些代码,供每个 API 的每个路由器使用,以验证授权并允许或拒绝请求。像这样的东西:

因此,基于这个问题,我发现 ABAC 可以从应用程序(API)中外部化,并且对我来说很有意义,请参见下图。
但接下来我有一些问题。
按照我在第一张图片或第二张图片中的想法去做是不好的吗?
PDP 如何知道用户想要做什么?根据他呼叫的路线?但通过这种方法,单一责任将会受到损害,因为 PDP 需要内化(步骤 2)其他应用程序的行为,对吧?
PIP需要调用数据库来让PDP验证授权。因此,这可能会很慢,因为相同的查询将执行两次,一次用于检查策略,另一次在服务内部使用业务逻辑。
我试图通过 Ory Keto 实现以下几点:
UserA拥有ProductA-> 所有权赋予一项 CRUD 权利。UserB具有角色Admin->Admin赋予一个对所有事物的 CRUD 权限。UserA具有角色KYCVerified或属于名为KYCVerified-> 的组的一部分,这为用户提供了额外的权限。第 1 点描述了所有权的概念,根据 Ory Keto 的当前状态,将其描述为 RBAC 的缺点之一(来源):
不存在所有权概念:Dan 是文章“Hello World”的作者,因此可以更新它。
第 2 点描述了一个基本上通过了所有权检查的角色,因为这个角色可以做所有事情。这在当前状态下应该是可能的,但不能与第 1 点结合使用。
第 3 点描述的内容与第 2 点基本相同,但这更针对我的用例。
我在Ory网站上读过这篇文章和这篇文章。然而,我仍然无法理解这个概念。我举了以下例子来说明我如何看待 Ory Keto 的所有权概念:
# Tenant TenantA needs to be a owner of product ProductA in order to view it
products:ProductA#view@(tenants:TenantA#owner)
# Tenant A is a owner of ProductA …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用授权端点为 ASP.NET Web API 设置集成测试。
我已按照 Microsoft 的文档将模拟身份验证添加到集成测试中,以允许测试客户端访问授权端点。https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0
例如
builder.ConfigureTestServices(services =>
{
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes("Test")
.RequireAuthenticatedUser()
.Build();
});
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是默认身份验证方案,则可以很好地工作,您可以在集成测试启动时更改该方案以使用测试方案。但是,我的授权端点正在使用指定的AuthenticationSchemes,因此测试方案永远不会被端点授权。例如
[Authorize(AuthenticationSchemes = "Scheme1,Scheme2")]
public class AppVersionController : ControllerBase
{
...
}
Run Code Online (Sandbox Code Playgroud)
我可以通过在测试时指定环境变量、检查它并将测试方案动态添加到授权端点来解决这个问题。然而,这为应用程序添加了许多特定于测试的逻辑,这在主项目中并不好。
这会起作用:
// Test scheme added dynamically from an environment variable to get the below result
[Authorize(AuthenticationSchemes = "Scheme1,Scheme2,Test")]
public class AppVersionController : ControllerBase
{
...
}
Run Code Online (Sandbox Code Playgroud)
我通过创建一个自定义属性来完成此操作,该属性基本上如下所示:
public class AuthorizeAll : AuthorizeAttribute
{
public AuthorizeAll()
{
var authenticationSchemes = "Scheme1,Scheme2"; …Run Code Online (Sandbox Code Playgroud) c# integration-testing authorization asp.net-core-webapi .net-6.0
我观看了一个指南,其中作者将访问令牌存储在 localStorage 中,然后他将访问令牌作为授权标头,并通过 axios 拦截器在每个请求中使用值“Bearer accessToken”。但我想知道为什么不像我们使用刷新令牌那样将访问令牌存储在 httpOnly cookie 中。如果有的话会出现什么问题?
我有一个关于HTML的问题.我知道有这种机制不允许用户直接访问网页,除非他们输入密码和名称.什么是HTML代码?
我正在尝试在我的rails3 + mongoid应用程序中使用具有CanCan角色的Devise授权.现在我必须限制用户编辑事件的权限,因此只有他们的作者可以这样做.该事件的作者由该行确定:
<%= f.hidden_field (:author, :value =>current_user.email) %>
Run Code Online (Sandbox Code Playgroud)
所以,现在在CanCan的Ability文件中我正在尝试使用此代码:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role? :admin
can :manage, :all
else
can :read, :all
end
if
user.role?(:normal)
can :create, Event
can :update, Event do |event|
event.try(:author) == current_user.email
end
can :create, Comment
can :update, Comment do |comment|
comment.try(:author) == current_user.email
end
end
end
Run Code Online (Sandbox Code Playgroud)
结束
但这导致了我的错误:
未定义的局部变量或方法`current_user'for#
然后我试着改变
can :update, Event do |event|
event.try(:author) == current_user.email
Run Code Online (Sandbox Code Playgroud)
至
event.try(:author) == Devise.current_user.email
Run Code Online (Sandbox Code Playgroud)
但这导致了这个错误
设计的未定义方法`current_user':模块
那么,我应该怎么做以及如何从ability.rb中调用`current_user'方法?提前感谢您的任何提示.
我有一个带有一些常规方法的用户控制器.我的ability.rb已设置但我需要未登录的用户才能处理这一操作.我已经在我的ability.rb中为未登录的用户尝试了以下所有内容,但它没有任何区别......我仍然收到未经授权的错误.
can :create, User
can :update, User
can :edit, User
can :modify, User
Run Code Online (Sandbox Code Playgroud)
接下来我尝试在我的ability.rb中创建一个条目
can :do_this_action, User
Run Code Online (Sandbox Code Playgroud)
并将其放在用户控制器中
authorize!(:can_do_this_action, User.new || @user)
Run Code Online (Sandbox Code Playgroud)
仍然没有运气..
最后,我试图跳过这个动作.我在用户控制器中用它做了这个:
skip_authorization_check :only => [:create, :new, :custom_method ]
authorize_resource
Run Code Online (Sandbox Code Playgroud)
这仍然给我的自定义方法一个未经授权的错误 任何人都知道我哪里出错了?提前致谢.
在DB我有Role和User一对多关系的实体.
我想要做的是建立自定义授权过滤器.我见过的所有教程都使用默认ASP.NET会员资格.我所知道的是,我需要继承,AuthorizationAttribute但不知道我需要覆盖哪些方法以及如何实现它们.
public class UserAuth : AuthorizeAttribute
{
}
Run Code Online (Sandbox Code Playgroud)
在DB:
角色
public class Role
{
[Key]
public int RoleID { get; set; }
[Required]
public int RolenameValue { get; set; }
[MaxLength(100)]
public string Description { get; set; }
// // // // //
public Rolename Rolename
{
get { return (ProjectName.Domain.Enums.Rolename)RolenameValue; }
set { RolenameValue = (int)value; }
}
public virtual ICollection<User> Users { get; set; } …Run Code Online (Sandbox Code Playgroud)