Добавленные в ClaimsIdentity утверждения теряются в ASP.NET Core Identity System - PullRequest
0 голосов
/ 04 октября 2018

В моем ядре ASP.NET Core я заметил, что мое заявление, которое я добавляю, теряется .

Сначала у меня есть представление Создать заявку, имеющее форму для создания заявки.Заявка добавлена ​​к зарегистрированному в данный момент пользователю .

Код метода Action:

[HttpPost]
[ActionName("Create")]
public IActionResult Create_Post(string claimType, string claimValue, string claimIssuer)
{
    ClaimsIdentity identity = User.Identity as ClaimsIdentity;
    Claim claim = new Claim(claimType, claimValue, ClaimValueTypes.String, claimIssuer);
    identity.AddClaim(claim);
    return RedirectToAction("Index");
}

В эту строку добавлено предложение - identity.AddClaim(claim);.

Теперь последняя строка перенаправляется на действие Indexметод с кодом:

public ViewResult Index() => View(User?.Claims);

Представление индекса, в котором отображаются все претензии для пользователя:

@model IEnumerable<System.Security.Claims.Claim>
<table class="table table-sm table-bordered">
    <tr>
        <th>Subject</th>
        <th>Issuer</th>
        <th>Type</th>
        <th>Value</th>
    </tr>

    @foreach (var claim in Model.OrderBy(x => x.Type))
    {
        <tr>
            <td>@claim.Subject.Name</td>
            <td>@claim.Issuer</td>
            <td>@claim.Type</td>
            <td>@claim.Value</td>
        </tr>
    }
</table>

Пример: я добавил претензию, см. изображение ниже enter image description here

Но индексное представление не получило претензию, см. Изображение ниже: enter image description here

Что не так?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Если вы хотите сохранить претензии в User?.Claims, вам нужно позвонить _signInManager.Context.SignInAsync с обновленным ClaimsIdentity.

Выполните следующие действия:

  • Расширение для входа с новым ClaimsIdentity

    public class CustomClaimsCookieSignInHelper<TIdentityUser> where TIdentityUser : IdentityUser
    {
    private readonly SignInManager<TIdentityUser> _signInManager;
    
    public CustomClaimsCookieSignInHelper(SignInManager<TIdentityUser> signInManager)
    {
        _signInManager = signInManager;
    }
    
    public async Task SignInUserAsync(ClaimsIdentity claimsIdentity)
    {
        await _signInManager.Context.SignInAsync(IdentityConstants.ApplicationScheme, new ClaimsPrincipal(claimsIdentity));
    }
    
    }
    
  • Регистрация CustomClaimsCookieSignInHelper<TIdentityUser>

    services.AddTransient<CustomClaimsCookieSignInHelper<IdentityUser>>();
    
  • Обновление заявок пользователей

    public class IdentityController : Controller
    {
    private readonly CustomClaimsCookieSignInHelper<IdentityUser> _signInHelper;
    private readonly UserManager<IdentityUser> _userManager;
    public IdentityController(CustomClaimsCookieSignInHelper<IdentityUser> signInHelper
        , UserManager<IdentityUser> userManager)
    {
        _signInHelper = signInHelper;
        _userManager = userManager;
    }
    public ViewResult Index() => View(User?.Claims);
    
    
    [HttpGet]
    [ActionName("Create")]
    public IActionResult Create_Post()
    {
        return View();
    }
    
    [HttpPost]
    [ActionName("Create")]
    public async Task<IActionResult> Create_Post(string claimType, string claimValue, string claimIssuer)
    {
        ClaimsIdentity identity = User.Identity as ClaimsIdentity;
        Claim claim = new Claim(claimType, claimValue, ClaimValueTypes.String, claimIssuer);
        identity.AddClaim(claim);
        await _signInHelper.SignInUserAsync(identity);
    
        return RedirectToAction("Index");
    }
     }
    
0 голосов
/ 04 октября 2018

Претензии, добавленные аутентифицированному пользователю, не будут сохраняться в других запросах.Претензии должны быть добавлены до входа в систему.

Вы можете посмотреть здесь , чтобы узнать, как добавить претензии к пользователю.

И здесь дляпример изменения пользовательских утверждений после входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...