【问题标题】:Pass temp data from MyAuthenticationHandler to MyAuthorizationFilterAttribute in Web API将临时数据从 MyAuthenticationHandler 传递到 Web API 中的 MyAuthorizationFilterAttribute
【发布时间】:2014-01-19 00:34:27
【问题描述】:

当我的身份验证处理程序成功通过(userId 取自解密的令牌)时,我想将 userId 添加到当前请求对象的某处。

稍后在管道中,当用户通过身份验证时,授权被执行,在这里我再次需要 userId,因为我必须禁止经过身份验证的用户操纵具有特定 userId 的其他用户的数据。

暂时保存 userId 的最佳方法是什么?我应该滥用 request.headers 来添加 userId 吗?

【问题讨论】:

  • HttpRequestMessage 上有一个 Properties 集合供您使用。
  • 谢谢,应该可以。以前从未见过该系列;-)

标签: asp.net-web-api asp.net-web-api2


【解决方案1】:

cmon Darrel...请不要重新发明轮子;)

身份验证处理程序的结果应该是 ClaimsPrincipal(在 HttpAuthenticationContext.Principal 上设置)。

通过这种方式,您可以使用户 ID 可用于授权过滤器 - 以及 ApiController.User。

【讨论】:

  • 您好 Dominick,知道您是安全专家 ;-) 我想就您的建议提出一个简单的问题。如果我遵循@Darrel 的建议,我的 userId 也可以在我的自定义 AuthorizationFilter 以及通过 Request.Properties 等的 UserController 中使用......那么使用您的 ClaimsPrincipal 真的有什么优势?
  • 我的 AuthenticationHandler 是 DelegatingHandler 没有 HttpAuthenticationContext 属性。我只能在 http 过滤器中找到 HttpAuthenticationContext 类,但在管道中为时已晚。好的,我找到了:在 handler.SendAsync 里面我可以做:request.GetRequestContext();存在具有 Principal 属性的对象。但它只有一个名称(字符串)属性。我有一个 userId (int)... 名称根本不是唯一的。这令人困惑......
  • 这是一个简单的架构 - 有人(例如处理程序)设置主体 - 请求的其余部分通过标准机制“获取”它。例如它被传递到 authZ 过滤器 - 它可以通过 ApiController.User、Request.RequestContext 等获得。只需创建一个包含声明(例如 ClaimTypes.NameIdentifier)的声明主体并将其设置在 RequestContext 上。当然,属性集合也有效。我只是说...
  • 是的,我理解您的担忧,并且它真的是关于这里的关注点分离,ClaimsPrincipal 是为此类事情而构建的。所以你提到了再发明。我只需要考虑我的 NameIdentinfier 是如何适应这里的,因为我总是必须使用 userId,它是一个 sql auto inc。如果我必须在我的身份验证处理程序或授权过滤器中访问数据库来检查事情,我总是必须使用整数 id,因此 ClaimsPrinicipal 对我来说似乎没用。
  • 好吧 - 向声明主体添加扩展方法,让您返回 int。
【解决方案2】:

HttpRequestMesssage.Properties。它是一个为存储请求范围数据而设计的字典。

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2021-01-04
    • 2021-06-13
    • 2014-07-18
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多