【问题标题】:How to add/remove claims at any time in controller如何在控制器中随时添加/删除声明
【发布时间】:2016-04-28 11:12:32
【问题描述】:

我需要能够随时在应用程序控制器中向用户添加/删除声明。这怎么可能?步骤是什么?

我正在使用 ASP.NET CORE RC1 并使用 Microsoft.AspNet.Authorization

例如:

public IActionResult ChangeUserInfo(int id, User user)
{
    var mUser = db.Users.Where(d => d.UserId == id).First();
    mUser.Email = user.Email;
    
    // change claims, How?
    
    db.SaveChanges();
    
    return View();
}

I'm using the new Authentication API and NOT Identity!

编辑:

这是我用来获取附加声明、将它们添加到声明身份并注销用户然后再次登录用户的方法,但它不起作用。 (如果用户手动退出,它可以工作)

public async Task<IActionResult> SingInAsync(HttpContext httpContext, string rememberme, bool forceSingOut = false, List<System.Security.Claims.Claim> additionalClaims = null)
        {
            var userIdentity = new ClaimsIdentity("SecureLogin");
            userIdentity.AddClaims(_claims);

            if(additionalClaims != null)
            {
                userIdentity.AddClaims(additionalClaims);
            }

            var userPrincipal = new ClaimsPrincipal(userIdentity);

            if(forceSingOut)
            {
                await httpContext.Authentication.SignOutAsync("Cookie");
            }

            await httpContext.Authentication.SignInAsync("Cookie", userPrincipal,
                new AuthenticationProperties
                {
                    ExpiresUtc = (rememberme != null) ? DateTime.UtcNow.AddDays(int.Parse(_config["AppOptions:RememberMeDuration"])) : DateTime.UtcNow.AddMinutes(20),
                    IsPersistent = false,
                    AllowRefresh = false,
                });

            return null;
        }

然后它被称为:

await customUserManager.SingInAsync(HttpContext, null, true, additClaims);

【问题讨论】:

    标签: c# authentication asp.net-core asp.net-core-mvc


    【解决方案1】:

    您可以添加这样的声明

    public async Task<bool> AddClaim(string type, string value)
        {
            var username = User.GetUserName();
            var user = await _userManager.FindByNameAsync(username);
    
            Claim claimToAdd = new Claim(type, value);
            var result = await _userManager.AddClaimAsync(user, claimToAdd);
    
            return result.Succeeded;
    
        }
    

    删除声明非常相似,您只需使用 _userManager.RemoveClaimAsync 代替。

    _userManager 是 UserManager 的一个实例,您可以通过依赖注入将其注入到您的控制器中。

     public ClaimController(UserManager<ApplicationUser> userManager,
            RoleManager<IdentityRole> roleManager,
            ILoggerFactory loggerFactory)
        {
            _userManager = userManager;
            _roleManager = roleManager;
            _logger = loggerFactory.CreateLogger<ClaimController>();
        }
    

    【讨论】:

    • 我在 RC1 上,但我认为那里没有 UserManager。另外我没有使用 ASP.NET Identity。
    • 是的。命名空间是 Microsoft.Asp.Net.Identity.UserManager。
    • 你错了。命名空间Microsoft.Asp.Net 甚至都不存在。虽然有一个Microsoft.AspNet,但我又一次没有使用身份。
    • 我使用的是leastprivilege.com/2015/10/12/…,它与身份无关。
    • 对不起,Microsoft.AspNet.Identity,您可能只需要从 nuget 添加正确的包。但是,如果您不想使用 Identity(它为您做所有事情......),那么您的数据库中可能有一个 UserClaims 表,您正在使用 EF 访问该表,因此您必须使用添加/删除您的声明直接EF。 db.UserClaims.Add()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多