【问题标题】:How can I pass data from an AuthorizeAttribute to the Controller?如何将数据从 AuthorizeAttribute 传递到控制器?
【发布时间】:2011-10-03 21:06:32
【问题描述】:

我创建了一个自定义 AuthorizeAttribute 来验证在 HTTP 标头中发送的一些 OAuth 凭据。我正在使用其中一些凭据来识别发出请求的人。一旦我在 AuthorizeAttribute 中解析了这些信息,有没有办法将其传递给控制器​​的实例变量?然后在我的控制器中的任何地方,我都会有请求方的 ID。

【问题讨论】:

    标签: asp.net-mvc controller authorize-attribute


    【解决方案1】:

    原答案

    你应该可以在你的过滤器中做到这一点

    filterContext.HttpContext.Items["test"] = "foo";
    

    然后这在你的行动中

    _yourVariable = HttpContext.Items["test"];
    

    您可能希望使用比"test" 更独特的密钥,但这就是我们的想法。

    编辑我们在动作而不是构造函数中这样做有两个原因:

    1. A Controller's constructor fires before OnAuthorization,因此该项目尚未设置。
    2. 尚未在 Controller 的构造函数中设置 HttpContext。

    替代解决方案

    1. 创建一个新的OAuthController : Controller
    2. 覆盖OnAuthorization
    3. 将过滤器中的逻辑移至OAuthController.OnAuthorization
    4. OAuthController 中设置protected 字段(即protected object myAuthData
    5. 让您的其他控制器继承自 OAuthController 而不是 Controller
    6. 您的其他控制器可以访问myAuthData

    【讨论】:

    • 嗯...当我向控制器添加构造函数以设置此变量时,它破坏了我的所有模型绑定(引发错误)。还有其他想法吗?
    • @Ryan 我最初在我的回答中注明了这一点,但将其删除。也许我应该把它放回去。无论如何,控制器的构造函数在之前 OnAuthorization 触发,所以该项目还不会被设置。此外,此时控制器甚至还没有 HttpContext。您需要在 Action 中执行此操作。
    • @Ryan 另一种方法是创建OAuthController : Controller,让它覆盖我链接到的帖子中提到的OnAuthorization,让它设置一个protected成员,并让你的其他控制器继承从它。
    • 谢谢我忘记了,事实上我不能为控制器滚动我自己的 OnActionExecuting 吗?
    • @Ryan 没问题,绝对没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2017-03-23
    • 2019-07-26
    • 2020-05-29
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多