在我进行Asp.Net core Authorization部分工作时,我需要一个新属性AuthorizeAttribute,我想将其用作额外的权限值。因此,我AuthorizeAttribute在自己的自定义 Authorize 属性中扩展了。见下文:
public class RoleAuthorizeAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute
{
public string Permission { get; private set; }
public RoleAuthorizeAttribute(string policy, string permission) : base(policy)
{
this.Permission = permission;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个AuthorizationHandler来检查要求,如下所示:
public class RolePermissionAccessRequirement : AuthorizationHandler<RolePermissionDb>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolePermissionDb requirement)
{
// check here..
context.Succeed(requirement);
return Task.FromResult(0);
}
}
Run Code Online (Sandbox Code Playgroud)
所有相应的服务集合映射我已经做过了,这里就省略了。
现在,我希望我的属性在控制器操作级别上像这样使用:
[RoleAuthorize("DefaultPolicy", "CustomPermission")]
public IActionResult List()
{
}
Run Code Online (Sandbox Code Playgroud)
有人会建议我如何访问处理程序 RolePermissionAccessRequirement 中 Action 方法顶部给出的权限属性值吗?
我想根据 …
对于基于角色的 RESTful API 访问,将访问权限存储在数据库表中是否是常见做法(并被认为是安全的)?我指的是用于限制用户访问某些端点、HTTP 方法(GET、POST、PUT、DELETE)或限制在查询中接受/返回哪些字段的访问权限。
或者访问权限是否更典型地存储在应用程序代码中(即,基于角色的逻辑编译到 API 本身中)?更一般地说,处理 RESTful API 的自定义访问权限的推荐方法是什么?
我不是指 API 本身的用户身份验证或基于 OAuth 的授权,这将通过标准的基于令牌的机制处理。
我们正在 Java EE 7 中构建一个 RESTful API,它包括一个基于角色的访问控制机制,以确定在查询中接受/返回哪些端点、HTTP 方法和字段。在我们最初的设计中,我们在端点方法上使用容器请求过滤器读取的自定义注释来根据用户的角色确定用户的权限,并在(反)序列化过程中使用JsonView来过滤特定的实体字段。
该系统有效,但我们觉得它变得过于复杂且难以维护。我们已经讨论过将此授权信息移动到几个数据库表中,最重要的是一个存储表和列访问权限(PK 和 FK 列摘录)的表。
AccessPermissions
========================
| Column | Type |
========================
| TableName | varchar |
| ColumnName | varchar |
| HasCreate | bit |
| HasRead | bit |
| HasUpdate | bit |
| HasDelete | bit |
Run Code Online (Sandbox Code Playgroud)
每个角色(表未显示)可能会引用该AccessPermissions表中的许多行,以便端点方法访问和(反)序列化都可以通过询问用户是否具有允许请求访问的查询表和列名的条目来实现。
例如,POST /endpoint1with{"field1": …
我使用以下身份验证作为标题调用 Magento API,
auth = "OAuth oauth_consumer_key=**********************,oauth_consumer_secret=****************,oauth_token=************,oauth_token_secret=**************,oauth_signature_method=HMAC-SHA1,oauth_timestamp=" + ConstantFunctions.GetTimeStamp() + ",oauth_nonce=" + ConstantFunctions.GetNonce() + ",oauth_signature=*******************) ;
Run Code Online (Sandbox Code Playgroud)
当我调用 API 时,获取错误oauth_problem=signature_invalid。所有其他参数验证成功但签名中出现错误,我尝试使用以下代码生成签名,
public static String GETHMACSHA1(String value, String key)
throws UnsupportedEncodingException, NoSuchAlgorithmException,
InvalidKeyException {
String type = "HmacSHA1";
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), type);
Mac mac = Mac.getInstance(type);
mac.init(secret);
byte[] bytes = mac.doFinal(value.getBytes());
return bytesToHex(bytes);
}
private final static char[] hexArray = "0123456789abcdef".toCharArray();
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
int v;
for (int j …Run Code Online (Sandbox Code Playgroud) 背景
在 ASP.Net 核心中应用精细的权限级别限制的最佳方法是什么。我已经设置了身份验证,并且我的应用程序会发出在一定时间后过期的令牌。
我的 Web 应用程序还使用了角色和权限,其中某个角色可以与一组权限相关联。我已经播种了权限并限制了对它们的访问,因为即使是管理员用户也无法更改、创建或删除任何内容(即只读)。另一方面,角色是动态的,尽管超级管理员和管理员是固定的。任何具有超级管理员访问角色的用户都有权创建新角色并为该角色分配权限。
我想要做的是根据这些权限限制对我的应用程序中所有其他控制器的访问。
我正在考虑使用基于策略的授权,其中每个权限都将与特定策略相关联(即[Authorize(Policy = "delete users")])。然后我会将用户拥有的所有权限嵌入我在登录时发出的令牌中。
我不愿意以这种方式实现它,因为虽然权利可能是硬编码的,但它们可能/会随着时间的推移而增加,如果我拥有大量的权利,那么我将所有这些都嵌入到令牌。
有没有更好的方法可以达到这种安全级别???
我正在尝试添加
instance YesodAuthEmail App
Run Code Online (Sandbox Code Playgroud)
到Yesod-Postgres脚手架(是 1.6 版)并陷入编译错误。
相关代码是:
instance YesodAuth App where
type AuthId App = UserId
....
authPlugins :: App -> [AuthPlugin App]
authPlugins app = [authOpenId Claimed []] ++ extraAuthPlugins
where extraAuthPlugins = [ authEmail ]
instance YesodAuthEmail App where
type AuthEmailId App = UserId
afterPasswordRoute _ = HomeR
addUnverified email verkey =
runDB $ insert $ User email Nothing
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
/home/justin/code/yesodemail/src/Foundation.hs:273:11: error:
• Could not deduce: m ~ HandlerFor site0 from the context: MonadAuthHandler App …
我开始使用 Voter System 来保护我的 URL,但我有很多问题。
首先,我不知道我是否必须使用“角色”或“权限”。
“角色”是指 Role_User、Role_Manager 等。“权限”是指“Access_users”、“Edit_User”、“Add_User”等。
我说得对吗?
如果是,如果我没有要控制的对象,我想检查我的选民中的权限以控制对 URL 的访问。
例子
/**
* @Route("/", name="list")
* @Security("is_granted('ROLE_ADMIN') or is_granted('PERM_ACCESS_SERIES')")
*/
public function list()
{
$series = $this->seriesService->findAll();
return $this->render('backend/series/list.html.twig', [
"series" => $series
]);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想检查用户是否具有角色ROLE_ADMIN或权限PERM_ACCESS_SERIES,但我不知道如何在我的选民中进行。
有关信息,“ROLE_ADMIN”是在我的 security.yaml 配置中设置的,但我想让这些角色动态化,以便能够创建角色(并为角色分配权限?)。
在我的 Voter 类中,当我控制一个 Document 时,我会检查所有者和其他可以管理该 Document 的用户,但是当我不传递一个 Document 时,我真的不知道该怎么做。
只是获取用户的权限并检查请求的权限是否在他们中。类似的东西:
if (in_array($attribute, $user->getPermissions())) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
其实这是我的选民
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
//ADMIN and SUPER_ADMIN can do anything they want ! …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Postman 测试几个端点。
所有端点,都需要一个可以通过登录获得的令牌。
所以我这样做了:
请求 #1
登录成功后,我可以从响应中访问令牌,然后将该令牌存储在我的全局变量中。
let token = pm.response.json().location
console.log('Token : ', token.split("?token=")[1]);
pm.globals.set("token", token)
Run Code Online (Sandbox Code Playgroud)
我需要使用该令牌作为我的请求 #2 的授权类型承载令牌。
我可以将其复制并粘贴到令牌框中,但我尽量避免手动执行此操作,有没有办法自动执行此操作,以便我可以按顺序运行这 2 个请求?
我想对所有 api 路由使用 Web 身份验证。我创建了中间件,这就是它的样子
Route::group(['middleware' => ['auth:web'], 'prefix' => 'v1',], function ($router) {
Route::apiResource('subscriptions', 'Api\SubscriptionController');
Route::post('subscriptions/{id}/resend', 'Api\SubscriptionController@resend')->name('resend');
Route::post('subscriptions/{id}/grace', 'Api\SubscriptionController@addGrace')->name('grace');
Route::apiResource('accounts', 'Api\SocialMediaAccountController');
Route::post('accounts/{id}/reset', 'Api\SocialMediaAccountController@reset');
Route::apiResource('customers', 'Api\CustomerController');
});
Run Code Online (Sandbox Code Playgroud)
当我已经登录并尝试向 api 路由发出请求时,它会将我重定向到主页。我怎样才能解决这个问题 ?
这是 config/auth.php
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
], …Run Code Online (Sandbox Code Playgroud) 我已开始使用 AWS AppSync,但遇到了权限问题。
我使用 AppSync 为我的数据创建了一个 DynamoDB 表,并设置了与我已经创建的 Cognito 用户池一起使用的授权。
我设置了默认操作ALLOW,根据 AWS 文档 - https://docs.aws.amazon.com/appsync/latest/devguide/security.html#amazon-cognito-user-pools-authorization - 应该允许公共访问默认情况下运行在我的架构中定义的任何查询/变异/订阅。
上面的文档还说限制访问是通过@aws_auth在我的类型定义中添加一个来完成的。我还没有添加。
这就是我想要的:我希望我的查询是公开的 - 不需要添加@aws_auth指令 - 并且我的更改仅限于我的 Cognito 用户池中的 Admins 组。因此,在测试查询时,我应该能够将数据返回给我,而无需在任何地方登录。
但是,当尝试在 AppSync 控制台内运行任何测试查询时,我收到以下错误消息:
{
"errors": [
{
"errorType": "UnauthorizedException",
"message": "Unable to parse JWT token."
}
]
}
Run Code Online (Sandbox Code Playgroud)
显然,这与未使用 Cognito 登录有关。
我之前在没有使用 Cognito 授权的情况下测试过这些查询,它们都运行良好。由于我的默认操作设置ALLOW为我的 Cognito 授权方,我的查询现在应该运行相同,因为我没有修改它们。
查看我的查询、类型和解析器的代码,我无法发现它们的编写方式有什么不同。允许访问我的 DynamoDB 表的 IAM 角色也保持不变,没有附加任何限制。
到底是怎么回事?AppSync 是否存在错误,或者我在这里遗漏了什么?
请告诉我。谢谢
authorization amazon-web-services amazon-cognito graphql aws-appsync
我有一系列网页,并且在自定义数据库表中定义了对这些网页的授权。例如,我有一个名为“超级用户”的角色,该角色被允许访问某些网页。我有分配给该角色的用户。
我不明白如何将 Authorize 属性放在控制器上并传入页面名称(视图),然后从我的数据库中读取某种类型的自定义处理程序,以查看用户是否在具有权限的组中. 我一直在这里阅读基于策略的授权:https : //docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore - 2.2并试图理解它我的情况。
我是否在基于策略的授权的正确轨道上,或者在允许用户访问页面之前是否有另一种方法来进行数据库检查权限?
authorization ×10
asp.net-core ×3
c# ×3
rest ×2
android ×1
api ×1
asp.net-mvc ×1
aws-appsync ×1
bearer-token ×1
doctrine-odm ×1
express-jwt ×1
graphql ×1
haskell ×1
java ×1
jax-rs ×1
laravel ×1
magento-1.9 ×1
php ×1
postman ×1
retrofit ×1
security ×1
symfony ×1
symfony4 ×1
yesod ×1