【问题标题】:asp.net core 2.0 - Claims and policy based Authorizationasp.net core 2.0 - 基于声明和策略的授权
【发布时间】:2018-12-28 18:19:08
【问题描述】:

我正在使用带有声明身份的 cookie 身份验证。身份验证工作正常,但授权失败。

如果登录凭据匹配,这里将存储声明信息。

 var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
                identity.AddClaim(new Claim(ClaimTypes.Name, _user[0].UserName.ToString()));
                identity.AddClaim(new Claim(ClaimTypes.Role, _user[0].UserRole));
                identity.AddClaim(new Claim(ClaimTypes.Email, _user[0].UserEmail)); 
 HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));

这里是 startup.cs configurationServices 方法中的授权设置

 services.AddMvc();
 services.AddAuthorization(options => {
                options.AddPolicy("Admin", policy => policy.RequireClaim("Admin"));
                options.AddPolicy("User", policy => policy.RequireClaim("User"));

            });

和控制器

 [Authorize(Policy = "Admin")]
    public class UserController : Controller
    {
//
    }

尽管管理员使用角色登录,但此授权重定向到我以访问被拒绝的页面。这里有什么问题?

【问题讨论】:

    标签: c# cookies asp.net-core-mvc authorization claims-based-identity


    【解决方案1】:

    您需要指定声明类型及其应具有的值

    services.AddAuthorization(options => {
        options.AddPolicy("Admin", policy =>
            {
                policy.RequireClaim(ClaimTypes.Role, "Admin");
            });
         options.AddPolicy("User", policy =>
            {
                policy.RequireClaim(ClaimTypes.Role, "User");
            });
    });
    

    【讨论】:

    • 谢谢,,我改成你说的,现在管理员可以访问它了。用户角色应该拒绝访问。但用户角色现在也可以访问它
    • @e2e 你能在控制器的 Action 中的某处放置一个断点并探索 User 属性以确保它得到你期望的角色声明吗?
    • 嘿,谢谢。我解决了这个问题。问题是每次任何用户凭据匹配时,我都会从该函数返回所有用户,并且我正在给 user[0]。作为声明管理的对象。谢谢问题解决了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2017-06-08
    • 1970-01-01
    • 2019-12-16
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多