我在我的asp.net核心应用程序中设置了cookie身份验证。我有一个登录页面,在该页面中,凭据与活动目录匹配。这一切都很好。接下来,我想在我的应用程序中实现授权。我有一张用户表,上面有反对他们的权限。例如,像读和写这样的权限。当用户成功通过身份验证时,我希望检查这些权限,并在限制其他权限的同时向它们展示某些功能。例如,为写入权限显示某些下拉列表,而隐藏以获取读取权限。
在.NET核心中处理这一问题的最佳方法是什么。我读过一些关于增加政策的文章,比如:
services.AddAuthorization(options => {
options.AddPolicy("Read", policy =>
policy.RequireClaim("Read", "MyCLaim"));
});然后在我的控制器里:
[Authorize(Policy = "Read")]
public class HomeController : Controller
{
}从数据库中获取登录用户的权限,以及如何验证用户是否具有这些权限。
会很感激你的意见。
发布于 2017-10-26 18:51:02
从数据库中获取登录用户的权限,以及如何验证用户是否拥有这些权限。
在对用户进行身份验证之后,您将收集用户的声明,并将其存储在身份验证Cookie中。
public async Task SignInAsync(User user, IList<string> roleNames)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Sid, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName)
};
foreach (string roleName in roleNames)
{
claims.Add(new Claim(ClaimTypes.Role, roleName));
}
var identity = new ClaimsIdentity(claims, "local", "name", "role");
var principal = new ClaimsPrincipal(identity);
await _httpContextAccessor.HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme, principal);
}FYI:碰巧我把它们存储为角色声明。如果你不想的话,你不必走那条路。
然后,您可以在Startup.cs中验证策略。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
...
// Set up policies from claims
// https://leastprivilege.com/2016/08/21/why-does-my-authorize-attribute-not-work/
services.AddAuthorization(options =>
{
options.AddPolicy(Constants.RoleNames.Administrator, policyBuilder =>
{
policyBuilder.RequireAuthenticatedUser()
.RequireAssertion(context => context.User.HasClaim(
ClaimTypes.Role, Constants.RoleNames.Administrator))
.Build();
});
});
...
}
}用法与您所描述的相同。
[Authorize(Policy = "Read")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}https://stackoverflow.com/questions/46961011
复制相似问题