首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >授权.net核心2.0

授权.net核心2.0
EN

Stack Overflow用户
提问于 2017-10-26 18:05:50
回答 1查看 802关注 0票数 0

我在我的asp.net核心应用程序中设置了cookie身份验证。我有一个登录页面,在该页面中,凭据与活动目录匹配。这一切都很好。接下来,我想在我的应用程序中实现授权。我有一张用户表,上面有反对他们的权限。例如,像读和写这样的权限。当用户成功通过身份验证时,我希望检查这些权限,并在限制其他权限的同时向它们展示某些功能。例如,为写入权限显示某些下拉列表,而隐藏以获取读取权限。

在.NET核心中处理这一问题的最佳方法是什么。我读过一些关于增加政策的文章,比如:

代码语言:javascript
复制
services.AddAuthorization(options => {
            options.AddPolicy("Read", policy => 
                      policy.RequireClaim("Read", "MyCLaim"));
 });

然后在我的控制器里:

代码语言:javascript
复制
[Authorize(Policy = "Read")]
public class HomeController : Controller
{

}

从数据库中获取登录用户的权限,以及如何验证用户是否具有这些权限。

会很感激你的意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 18:51:02

从数据库中获取登录用户的权限,以及如何验证用户是否拥有这些权限。

在对用户进行身份验证之后,您将收集用户的声明,并将其存储在身份验证Cookie中。

例如,https://github.com/WinLwinOoNet/AspNetCoreActiveDirectoryStarterKit/blob/master/src/Presentation/Asp.Web.Common/Security/SignInManager.cs#L20方法。

代码语言:javascript
复制
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中验证策略。

代码语言:javascript
复制
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();
            });
        });
        ...
    }
}

用法与您所描述的相同。

代码语言:javascript
复制
[Authorize(Policy = "Read")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46961011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档