代码之家  ›  专栏  ›  技术社区  ›  Ashkan Nourzadeh

当用户角色更改时,使用user.isinrole返回随机结果

  •  1
  • Ashkan Nourzadeh  · 技术社区  · 6 年前

    我正在使用带有默认标识设置的ASP.NET Core 2.1,每次更改角色时,用户都应重新登录以查看角色更改。

    如果添加以下设置,则应根据每个请求更新角色, 这个 Authorize 属性有效 但是 User.IsInRole() 方法返回每个请求的随机结果。

    services.Configure<SecurityStampValidatorOptions>(options =>
    {
         options.ValidationInterval = TimeSpan.Zero;
    });
    

    有什么问题 用户.isinrole() 是吗?怎么解决?

    编辑: 我说的不对 授权 属性行为,也是随机的。

    编辑:
    重现问题的测试项目(警告:它正在使用InMemory DB)-> https://github.com/ans-ashkan/AspNetCoreUserIsInRoleTest

    http://localhost:5000/users/getall -> 200: ["test"]
    http://localhost:5000/users/signin?username=test&password=123 -> 200
    http://localhost:5000/users/isinrole?role=admin -> {"isInRole":false,"identityName":"test"}
    http://localhost:5000/users/adduserrole?username=test&role=admin -> 200
    http://localhost:5000/users/isinrole?role=admin -> {"isInRole":**random true or false**,"identityName":"test"}
    http://localhost:5000/users/signout -> 200
    http://localhost:5000/users/signin?username=test&password=123 -> 200
    http://localhost:5000/users/isinrole?role=admin -> {"isInRole":true,"identityName":"test"}
    

    编辑: Issue link on AspNet/MVC repo

    1 回复  |  直到 6 年前
        1
  •  2
  •   poke    6 年前

    我详细调查了这个问题 posted my findings in the issue 是的。它确实是一个bug,但实际上对您的问题没有那么大的影响:

    更改用户的角色不会使用户的安全戳失效,因此用户通过cookie接收的已发出声明标识实际上并不无效。因此,如果要在角色更改时使标识无效,则必须寻找其他解决方案。

    但是,在我看来,你完全误用了这一点:如果你想刷新身份及其声明 每一个请求 ,那么实际上完全没有必要拥有索赔身份。运行身份验证堆栈不是免费的,而且必须运行整个验证和重新发出的管道将非常昂贵。当你真的不想 商店 不管怎么说,标识的使用时间更长(因为您在下一个请求中正确地使其失效),那么这真的是浪费了工作。

    所以,如果你真的需要一个权限系统,绝对是尖锐和更新的时刻,当他们改变,然后考虑使用不同的东西。您可以建立一个单独的数据库,只需在其中存储“角色”,然后,当您访问受保护的内容时,只需在那里按需获取用户的角色来验证访问。这也将有助于您在每次请求时始终获取角色,因为现在您只能在需要时获取角色。

    当然,你不会 需要 一个单独的数据库。您还可以使用identity的内置角色。你只需要记住那个角色 声称 并不总是事实的来源,因此您应该始终从数据库(通过用户管理器)加载用户角色。

    实际上,使用asp.net内核可以很好地设计这个 authorization stack 是的。例如,可以为角色创建一个需求,然后实现一个授权处理程序,该处理程序通过遍历数据库来检查角色。这样,您就可以像为用户使用角色声明一样透明。你可以用同样的 Authorize 否则将使用的属性。