从Bearer令牌中获取自定义声明值(Web API)

22

在我的ASP.NET Web API项目中,我正在使用承载令牌授权,并添加了一些自定义声明,类似于这样:

var authType = AuthConfig.OAuthOptions.AuthenticationType;
var identity = new ClaimsIdentity(authType);
identity.AddClaim(new Claim(ClaimTypes.Name, vm.Username));

// custom claim
identity.AddClaim(new Claim("CompanyID", profile.CompanyId.ToString()));

我能否在控制器中访问此额外的索赔价值,而无需额外查询数据库?

1个回答

32

当然,在你的受保护控制器内部,你可以执行以下操作:

 ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;
 var customClaimValue = principal.Claims.Where(c => c.Type == "CompanyID").Single().Value;

我该如何以更集中的方式重用它?我正在使用一个需要customClaimValue的服务层。所有控制器操作在获取/发布数据之前都需要将此值发送到服务中。 - Steven Ryssaert
1
您可以创建自定义过滤器,在触发操作方法之前运行。 - Taiseer Joudeh
1
谢谢,我不知道你可以在过滤器中获取当前请求。还有,你的博客非常棒,Taiseer! - Steven Ryssaert
1
就我个人而言,我会在管道的早期使用自定义owin中间件来完成这项工作。然后我可以从owin的任何地方访问“CompanyID”。 - David Betz
当OWIN服务器位于我们用于从Web项目获取身份验证的WebAPI项目中时,我们该如何处理?我有一个WebAPI,它集中了所有应用程序的业务/身份验证,我有一个网站需要控制规则并使用API获取承载令牌。但是,我希望根据接收到的令牌(其中包含角色、公司ID等声明)来调节网站中控制器的访问权限。 - Ashallar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接