gpt4 book ai didi

asp.net-identity - ASP.NET 5 Identity - 为用户刷新角色

转载 作者:行者123 更新时间:2023-12-04 18:01:11 27 4
gpt4 key购买 nike

ASP.NET 5 中,假设我有以下 Controller :

[Route("api/[controller]")]
[Authorize(Roles = "Super")]
public class ValuesController : Controller
{
// GET: api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new[] { "value1", "value2" };
}
}

然后假设我有一个用户 Jack,他已登录但不是 Super 角色的成员。

当 Jack 尝试访问此资源时,正如预期的那样,他被拒绝访问。

然后,在另一台机器上,我使用 UserManager 将他添加到 Super 角色。

当 Jack 再次尝试访问此资源时,它仍然被拒绝访问,直到他注销并再次登录。

如何确保每个用户的角色不被缓存,或者在我进行更改时以某种方式刷新?

最佳答案

所以这就是我最终设法解决这个问题的方法,但实际上这应该通过安全戳来解决。下面的解决方案至少在授权发生之前提供了“查看”。

我创建了一个新的 AuthorizationHandler,它在其构造函数中接受一个 UserManager:

public class SuperRequirement : AuthorizationHandler<SuperRequirement>, IAuthorizationRequirement
{
public UserManager<ApplicationUser> UserManager { get; set; }

public SuperRequirement(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}

protected override void Handle(AuthorizationContext context, SuperRequirement requirement)
{
throw new System.NotImplementedException();
}

protected override async Task HandleAsync(AuthorizationContext context, SuperRequirement requirement)
{
var userName = context.User.Identity.Name;
var pass = await UserManager.IsInRoleAsync(await UserManager.FindByNameAsync(userName), "Super");
if (pass)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}
}

然后我在 Startup.cs 中配置了它:

public void ConfigureServices(IServiceCollection services)
{
...
var sp = services.BuildServiceProvider();
//var service = sp.GetService<ISomeService>();
services.AddAuthorization(options =>
{
options.AddPolicy("Super",
policy =>
{
var userManager = sp.GetService<UserManager<ApplicationUser>>();
policy.Requirements.Add(new SuperRequirement(userManager));
});
});
}

最后我更新了我的 Controller 以使用新的授权策略:

[Route("api/[controller]")]
[Authorize(Policy = "Super")]
public class ValuesController : Controller
{
// GET: api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new[] { "value1", "value2" };
}
}

这样它会检查每个请求的数据库以确保角色对齐,使用 UserManager 来执行此操作。

请注意 这会降低效率,因为现在每个 API 请求都会触发对数据库的额外调用,因此您应该实现某种缓存和失效机制;这只是为了演示原理。

关于asp.net-identity - ASP.NET 5 Identity - 为用户刷新角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35056231/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com