【问题标题】:User.IsInRole fails for one action but not for anotherUser.IsInRole 对一项操作失败,但对另一项操作失败
【发布时间】:2017-02-21 15:42:47
【问题描述】:

我已经在我的 MVC 应用程序中添加了一个自定义的授权属性,它确实

if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))

如果为真,它会将您重定向到未经授权的位置。

我将此属性放在控制器级别的控制器上。

一个动作可以正常工作,而在一个动作中我未经授权。

角色系统中是否存在一些错误或问题?我读过注销和登录可能会强制刷新某些缓存或其他内容,但是我使用的系统使用您的域凭据进行身份验证,因此无法注销。

我已尝试重新启动应用程序池并删除我的会话 cookie,但没有任何效果。

之前有没有人遇到过这个特定问题,或者有一些关于可能刷新与之相关的缓存的指导(假设它是一个缓存问题)?

ETA:系统上的另一个用户为自己分配了控制器所需的角色,这两个操作对他来说都很好。所以也许我的用户在某种程度上被窃听了。这是在 UAT 上进行的调试,比在我的本地机器上运行要稍微困难一些(工作正常)。

ETA2:我很确定这是一个缓存问题,因为在查询字符串中转到带有 ?1=1 的 URL,它可以工作。我无法使缓存无效。这可能是将来为人员分配角色时的问题。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 authorization authorize-attribute


    【解决方案1】:

    首先,我们需要更多代码才能给您任何明确的答案。然而:

    1. 缓存可能是个问题。如果您使用OutputCache 之类的任何内容,则应确保您使用的是VaryByCustom,并以某种方式在返回的自定义字符串中包含用户的ID 或其他识别令牌。

    2. 如果您要向用户添加角色,您必须注销用户并重新登录,否则会使他们的授权无效。例如,在 Identity 中,您可以简单地使安全标记无效,这将导致用户重新获得授权,从而更新自登录后发生更改的声明或角色等内容。

    【讨论】:

    • 可以肯定的是 (2),它只是针对安全令牌缓存 URL。我不能再发布任何代码,因为这都是 MVC 角色系统的内部代码。我认为我需要找到一种方法来使用户无效并重新验证以解决此问题。我很想知道它在哪里存储这个缓存,因为使应用程序池无效并不会清除它。进入遗留代码我去......
    猜你喜欢
    • 2017-12-06
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2021-10-01
    • 2019-12-30
    • 2020-10-26
    • 2013-11-22
    相关资源
    最近更新 更多