gpt4 book ai didi

c# - 在 Web API (.Net Framework) 中创建自定义 AuthorizeAttribute

转载 作者:行者123 更新时间:2023-12-01 19:15:47 24 4
gpt4 key购买 nike

我在 WebAPI 中使用 OAuth2.0 Owin(密码授予)。我的初始 token 响应如下所示

{
"access_token": "_ramSlQYasdsRTWEWew.....................",
"token_type": "bearer",
"expires_in": 17999,
"permissions": {
"user": [
"Add",
"Update",
"Delete"
],
"Product": [
"Read",
"Create"
]
}
}

我已经customized通过创建一个名为 permissions 的新 key 来响应,该 key 保存相应用户的权限。

从这里,我需要验证来 self 的资源服务器的每个请求,方法是检查用户是否有足够的权限来使用授权属性调用 API。

我从 here 找到了一个类似的例子其中涉及 Dot net Core,这不适合我的情况。

困难的部分是 permission JSON Key 本身与 ArrayList 构成一个复合体

[CustomAuthorize(PermissionItem.Product, PermissionAction.Read)]
public async Task<IActionResult> Index()
{
return View(Index);
}

public class CustomAuthorize : AuthorizeAttribute {
public AuthorizeAttribute (PermissionItem item, PermissionAction action) {
//Need to initalize the Permission Enums
}
public override void OnAuthorization (HttpActionContext actionContext) {
//Code to get the value from Permissions ArrayList and compare it with the Enum values
}
}

以上是我的想法。但由于 Permissions Key 和 Enum 比较的复杂性,我无法继续前进。

另外,还有一个问题,如果用户的权限是添加和更新,意味着我需要在 Controller 之前创建两个属性条件。

喜欢

[CustomAuthorize(PermissionItem.User, PermissionAction.Add)]
[CustomAuthorize(PermissionItem.User, PermissionAction.Update)]

这会导致添加更多行属性。那么有没有办法让它在单个条件中以 | 分隔?

[CustomAuthorize(PermissionItem.User, PermissionAction.Update|PermissionAction.Add)]

最佳答案

为什么不允许您的 CustomAuthorize 构造函数具有多个权限操作。

public class CustomAuthorize : AuthorizeAttribute
{
private readonly PermissionAction[] permissionActions;

public CustomAuthorize(PermissionItem item, params PermissionAction[] permissionActions)
{
this.permissionActions = permissionActions;
}

public override void OnAuthorization(HttpActionContext actionContext)
{
var currentIdentity = System.Threading.Thread.CurrentPrincipal.Identity;
if (!currentIdentity.IsAuthenticated) {
// redirect to access denied page
}

var userName = currentIdentity.Name;
// step 1 : retrieve user object

// step 2 : retrieve user permissions

// step 3 : match user permission(s) agains class/method's required premissions

// step 4 : continue/redirect to access denied page
}
}

您将使用以下内容注释您的类(class):[CustomAuthorize(PermissionItem.User, PermissionAction.Update, PermissionAction.Add)]

我不确定OP想在这里实现什么。如果您依赖 HTTP 请求来提供访问权限,那么这是一个很大的安全漏洞。对于每个请求,您应该从数据库中检索用户的访问权限信息,然后根据类/方法所需的权限进行匹配。

根据经验,您不应依赖请求对象来告诉您当前用户拥有哪些权限。您应该从数据存储中检索它们。

我的 CustomAttribute 实现

public class CustomAuthorize : System.Web.Http.AuthorizeAttribute
{
private readonly PermissionAction[] permissionActions;

public CustomAuthorize(PermissionItem item, params PermissionAction[] permissionActions)
{
this.permissionActions = permissionActions;
}

protected override Boolean IsAuthorized(HttpActionContext actionContext)
{
var currentIdentity = actionContext.RequestContext.Principal.Identity;
if (!currentIdentity.IsAuthenticated)
return false;

var userName = currentIdentity.Name;
using (var context = new DataContext())
{
var userStore = new UserStore<AppUser>(context);
var userManager = new UserManager<AppUser>(userStore);
var user = userManager.FindByName(userName);

if (user == null)
return false;

foreach (var role in permissionActions)
if (!userManager.IsInRole(user.Id, Convert.ToString(role)))
return false;

return true;
}
}
}

关于c# - 在 Web API (.Net Framework) 中创建自定义 AuthorizeAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51568427/

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