- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在单个 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/
如果达到我的自定义政策中的特定步骤/条件,我将尝试从 claim 包中删除所有 claim ,但我找不到任何相关信息。然后我尝试对字符串使用 NullClaim Transformation,但我找不
我正在实现一个 oAuth 服务器并且需要存储刷新 token ,为此我(目前)选择将 token 序列化为 JSON。 虽然我可以看到 JSON 包含重新水化所需的一切,但当我使用 token.Fr
我正在创建一个简单的 WebApi,它允许用户连接到 Facebook。当我从 facebook 取回 accessToken 时,我调用 RegisterExternal 来创建一个 Asp.Net
我似乎无法序列化 Claim - 我做错了什么?使用此方法的其他对象序列化工作正常。 代码 var client = new MongoClient("mongodb://localhost:2701
我正在尝试在 ASP.NET Core 中使用基于 Windows 身份验证的声明授权。我有一个设置用户声明的声明转换器。我还通过 DbContext 将 IPrincipal 注入(inject)到
我直接使用 AspNetUserClaims 表,因为它主要属于我的 ASP.NET 应用程序,但也被 Windows 应用程序使用。 ASP.NET 应用程序使用 Google 进行外部登录,而 W
我从 ASP.NET Identity 的声明授权开始,如果我的应用程序中需要“角色”概念,我想阐明处理它们的方式。 注意:我对这个真的很陌生,所以所有的概念都在我脑海中飞舞,请多多关照,对于任何概念
我已经安装了 WSO2 IS 5.2.0,但我无法检索自定义创建的声明。 我为方言添加了新声明 http://wso2.org/claims我还添加了将相同属性映射到方言的新声明 http://wso
我们正在尝试使用组织 AD 作为 IDP,使用 SAML 和 Azure B2C 作为服务提供商 (SP) 设置 SSO。Org AD 被许多其他 SP 供应商用作 IDP(SAML),并且工作得很好
我正在开发一个 MVC4 应用程序,该应用程序使用 ADFS 对公司域用户进行身份验证,我已经编写了代码,但收到如下错误,我是否没有收到 claim ? System.InvalidCastExcep
我收到针对 Azure AD 进行身份验证的用户的组超额 claim 。如下所示: {"src1":{"endpoint":"https://graph.windows.net/TENANTID/us
我收到针对 Azure AD 进行身份验证的用户的组超额 claim 。如下所示: {"src1":{"endpoint":"https://graph.windows.net/TENANTID/us
是否可以将 SAML 声明发送到 ADFS,然后让 ADFS 使用来自传入声明的值来生成自己的声明? 基本上,我们需要发送 a)关于用户的信息(相当简单),以及 b)关于目标的信息(手头的问题)。目标
我目前正在开发 API。 token 从 IdentityServer4 返回。 我正在尝试从 token 声明中取回子 ID,即当前授权用户的 ID。我可以在此处的声明中看到它。 { "nbf"
我目前正在使用 asp.net core 设计一个系统,我想实现基于声明的授权,但有一个特定的部分让我感到困惑。 当提出声明时,声明将包括类型和值以及可选的发行者。在处理程序中,可以在确认访问之前检查
我需要从 JWT 中提取声明。 看来这应该是理所当然的。 它已签名,从我得到的标题中: { "alg": "RS256", "typ": "JWT" } 智威汤逊: eyJhbGciOiJSU
我是一个长期的 .NET Framework/WebForms 开发人员,并且正在为一个新项目转向 Core (2.1)。我已经建立了基础部分,一个 VS 解决方案包含一个 DAL 项目和一个 Web
我正在尝试根据特定声明的值过滤用户。 我使用 ASP .Net Core 3 和 RavenDB。 filteredData = data.Search(d => d.Email, model.sea
我将 WSO2 身份服务器用于单点登录实现。 在我的演示应用程序中,我试图从我自己的 JDBC 数据库中获取经过身份验证的用户的自定义声明属性。 我关注了这个 blog普什帕兰卡。 这适用于 Iden
我想通过Identity内的Claim访问我的电子邮件地址 我尝试访问为: var email = User.Identity.GetClaimsByType("emailaddress").ToSt
我是一名优秀的程序员,十分优秀!