gpt4 book ai didi

c# - ClaimsPrincipal Permission vs Claims Authorization Attributes 使用不同的信息,最好使用

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:36 26 4
gpt4 key购买 nike

我正在尝试在单个 webapi 上实现声明基础授权...但是我不希望用户声明与 webapi 紧密耦合。使用 ClaimsPrincipalPermissions 我得到了所需的解耦,因为我可以将用户分配给数据库中的资源。例如

WebAPI方法

    [ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Roles")]
public async Task<IHttpActionResult> GetRole(string Id)
{
var role = await AppRoleManager.FindByIdAsync(Id);

if (role != null)
{
return Ok(ModelFactory.Create(role));
}

return NotFound();

}

使用自定义授权管理器

public class AuthorizationManager : ClaimsAuthorizationManager
{
public override bool CheckAccess(AuthorizationContext context)
{
//return base.CheckAccess(context);
string resource = context.Resource.First().Value;
string action = context.Action.First().Value;

if (action == "Manage" && resource == "Roles")
{
// check for roles
//context.Principal.IsInRole("Admin");
bool hasRolesManagement = context.Principal.HasClaim("ManageRoles", "True");
return hasRolesManagement;
}

return false;
}

}

我可以对特定的登录用户进行适当的检查,检查他们对他们访问的资源的声明。但是,我无法以这种方式将适当的未经授权的响应反馈给用户。我找到的另一个例子是下面的 webapi 如下

    [ClaimsAuthorization(ClaimType="ManageRoles", ClaimValue="True")]
[Route("")]
public IHttpActionResult Get()
{
return Ok();
}

然后使用自定义声明授权属性

public class ClaimsAuthorizationAttribute : AuthorizationFilterAttribute
{
public string ClaimType { get; set; }
public string ClaimValue { get; set; }

public override Task OnAuthorizationAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
{

var principal = actionContext.RequestContext.Principal as ClaimsPrincipal;

if (!principal.Identity.IsAuthenticated)
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
return Task.FromResult<object>(null);
}

if (!(principal.HasClaim(x => x.Type == ClaimType && x.Value == ClaimValue)))
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
return Task.FromResult<object>(null);
}

//User is Authorized, complete execution
return Task.FromResult<object>(null);

}
}

这使我能够访问 actionContext 以发回适当的 statusCoded 响应。

第二种方法的重要警告是为新声明引入 api 方法的可访问性,我必须重新编译代码。

所以我的问题是如何获得第一种方法的灵 active ,其中每个 api 被指定为资源并且声明在数据库中分配给资源,但仍然获得第二种方法的灵 active ,我可以访问到操作上下文并能够返回正确的状态编码响应?我们不想重新编译代码以允许其他角色/声明访问 webapi 资源。

我是 claim 的新手,所以我还没有完全理解所有概念,所以如果我遗漏了什么,请告诉我。

最佳答案

根据 ClaimsPrincipalPermission.Demand 的文档

"If the current principal is not authorized for the specified action on the specified resource, a SecurityException is thrown; otherwise, execution proceeds."

解决方案是在您的解决方案中创建异常处理程序并返回 UnAuthorized Http 响应。 (我真的认为 ASP.Net 默认情况下会这样做,但我从未检查/反射(reflection)过这一点:)

关于c# - ClaimsPrincipal Permission vs Claims Authorization Attributes 使用不同的信息,最好使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398885/

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