Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET EF6 Identity 2更新用户声明更新用户时出错_C#_Asp.net Mvc_Asp.net Mvc 5_Claims Based Identity_Asp.net Identity 2 - Fatal编程技术网

C# ASP.NET EF6 Identity 2更新用户声明更新用户时出错

C# ASP.NET EF6 Identity 2更新用户声明更新用户时出错,c#,asp.net-mvc,asp.net-mvc-5,claims-based-identity,asp.net-identity-2,C#,Asp.net Mvc,Asp.net Mvc 5,Claims Based Identity,Asp.net Identity 2,我有一个web应用程序,其中我使用ASP.NET Identity 2声明作为网站用户的访问控制列表。我在ApplicationUser模型中正确地提供了所有索赔,它有一个索赔列表 我试图为一个用户澄清声明,然后给他们一整套新的声明。 我有一个索赔组对象,其中包含索赔项目列表 [HttpPost, ValidateAntiForgeryToken] public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(

我有一个web应用程序,其中我使用ASP.NET Identity 2声明作为网站用户的访问控制列表。我在ApplicationUser模型中正确地提供了所有索赔,它有一个索赔列表

我试图为一个用户澄清声明,然后给他们一整套新的声明。 我有一个索赔组对象,其中包含索赔项目列表

[HttpPost, ValidateAntiForgeryToken]
    public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(Include = "Id,SelectedClaimGroupId")] UserClaimsViewModel viewModel)
    {
        User user = await _repository.GetAsync<User>(viewModel.Id);
        ApplicationUser appUser = await UserManager.FindByIdAsync(user.AppUser.Id);
        var claimGroup = await _repository.GetAsync<ClaimGroup>(Convert.ToInt32(viewModel.SelectedClaimGroupId));

        appUser.Claims.Clear();// Clear all the claims first

        // Then add the new claims.
        foreach (ClaimGroupItems claimGroupItem in claimGroup.Items)
        {
            //UserManager.AddClaim(user.AppUser.Id, new Claim(claimGroupItem.MenuItemId.ToString(), claimGroupItem.ClaimValue));
            appUser.Claims.Add(new IdentityUserClaim()
            {
                ClaimType = claimGroupItem.MenuItemId.ToString(),
                ClaimValue = claimGroupItem.ClaimValue,
                UserId = user.AppUser.Id,
            });
        }

        try
        {
            _repository.Save<User>(appUser.User);
            //await UserManager.UpdateAsync(appUser);
        }
        catch (DbEntityValidationException dbEx)
        {
            foreach (var validationErrors in dbEx.EntityValidationErrors)
            {
                foreach (var validationError in validationErrors.ValidationErrors)
                {
                    Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                        validationErrors.Entry.Entity.GetType().FullName,
                        validationError.PropertyName,
                        validationError.ErrorMessage);
                }
            }

            throw;  // You can also choose to handle the exception here...
        }

        return RedirectToAction("Claims", new { id = viewModel.Id, Updated = true });
    }
此错误是由以下调用引起的: appUser.Claims.Clear()


我如何才能正确地为用户更新声明?

我让它工作起来了。出于某种原因,appUser.Claims.Clear()无法工作,并导致userId为null错误。所以我在一个循环中手动删除了旧的声明,现在一切都正常了

[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(Include = "Id,SelectedClaimGroupId")] UserClaimsViewModel viewModel)
{
    var claimGroup = await _repository.GetAsync<ClaimGroup>(Convert.ToInt32(viewModel.SelectedClaimGroupId));
    User user = await _repository.GetAsync<User>(viewModel.Id);
    ApplicationUser appUser = await UserManager.FindByIdAsync(user.AppUser.Id);

    // Remove all the old claims
    var listToRemove = appUser.Claims.ToArray();
    foreach (var item in listToRemove)
    {
        await UserManager.RemoveClaimAsync(item.UserId, new Claim(item.ClaimType, item.ClaimValue));
    }

    try
    {
        // Then add the new claims.
        foreach (ClaimGroupItems claimGroupItem in claimGroup.Items)
        {
            //UserManager.AddClaim(appUser.Id, new Claim(claimGroupItem.MenuItemId.ToString(), claimGroupItem.ClaimValue));
            appUser.Claims.Add(new IdentityUserClaim()
            {
                UserId = appUser.Id,
                ClaimType = claimGroupItem.MenuItemId.ToString(),
                ClaimValue = claimGroupItem.ClaimValue,
            });
        }
        await UserManager.UpdateAsync(appUser);
    }
    catch (DbEntityValidationException dbEx)
    {
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                    validationErrors.Entry.Entity.GetType().FullName,
                    validationError.PropertyName,
                    validationError.ErrorMessage);
            }
        }

        throw;  // You can also choose to handle the exception here...
    }

    return RedirectToAction("Claims", new { id = viewModel.Id, Updated = true });
}
[HttpPost,ValidateAntiForgeryToken]
公共异步任务声明\u UpdateByClaimGroup([Bind(Include=“Id,SelectedClaimGroupId”)]UserClaimsViewModel视图模型)
{
var claimGroup=await_repository.GetAsync(Convert.ToInt32(viewModel.SelectedClaimGroupId));
User=await\u repository.GetAsync(viewModel.Id);
ApplicationUser-appUser=await UserManager.FindByIdAsync(user.appUser.Id);
//删除所有旧的声明
var listToRemove=appUser.Claims.ToArray();
foreach(listToRemove中的var项)
{
等待UserManager.RemoveClaimAsync(item.UserId,新声明(item.ClaimType,item.ClaimValue));
}
尝试
{
//然后添加新的声明。
foreach(claimGroup.Items中的ClaimGroupItems claimGroupItem)
{
//UserManager.AddClaim(appUser.Id,新声明(claimGroupItem.MenuItemId.ToString(),claimGroupItem.ClaimValue));
appUser.Claims.Add(新的IdentityUserClaim()
{
UserId=appUser.Id,
ClaimType=claimGroupItem.MenuItemId.ToString(),
ClaimValue=claimGroupItem.ClaimValue,
});
}
等待UserManager.UpdateAsync(appUser);
}
catch(DbEntityValidationException dbEx)
{
foreach(dbEx.EntityValidationErrors中的var validationErrors)
{
foreach(validationErrors.validationErrors中的var validationError)
{
Trace.TraceInformation(“类:{0},属性:{1},错误:{2}”,
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
throw;//您也可以选择在此处处理异常。。。
}
返回RedirectToAction(“Claims”,new{id=viewModel.id,Updated=true});
}

…您是否介意将ApplicationUser类放在原始帖子中,以便hep人员更好地理解问题和解决方案。
[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(Include = "Id,SelectedClaimGroupId")] UserClaimsViewModel viewModel)
{
    var claimGroup = await _repository.GetAsync<ClaimGroup>(Convert.ToInt32(viewModel.SelectedClaimGroupId));
    User user = await _repository.GetAsync<User>(viewModel.Id);
    ApplicationUser appUser = await UserManager.FindByIdAsync(user.AppUser.Id);

    // Remove all the old claims
    var listToRemove = appUser.Claims.ToArray();
    foreach (var item in listToRemove)
    {
        await UserManager.RemoveClaimAsync(item.UserId, new Claim(item.ClaimType, item.ClaimValue));
    }

    try
    {
        // Then add the new claims.
        foreach (ClaimGroupItems claimGroupItem in claimGroup.Items)
        {
            //UserManager.AddClaim(appUser.Id, new Claim(claimGroupItem.MenuItemId.ToString(), claimGroupItem.ClaimValue));
            appUser.Claims.Add(new IdentityUserClaim()
            {
                UserId = appUser.Id,
                ClaimType = claimGroupItem.MenuItemId.ToString(),
                ClaimValue = claimGroupItem.ClaimValue,
            });
        }
        await UserManager.UpdateAsync(appUser);
    }
    catch (DbEntityValidationException dbEx)
    {
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                    validationErrors.Entry.Entity.GetType().FullName,
                    validationError.PropertyName,
                    validationError.ErrorMessage);
            }
        }

        throw;  // You can also choose to handle the exception here...
    }

    return RedirectToAction("Claims", new { id = viewModel.Id, Updated = true });
}