Как изменить претензию при входе пользователя в систему - PullRequest
0 голосов
/ 19 января 2019

Пользователь владеет многими магазинами в моей системе.

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

Итак, я добавляю претензию с именем 'LoginShop' в UserClaims.

Когда пользователь выбираетЧтобы управлять магазином, мне нужно обновить значение претензии до выбранного идентификатора магазина, а затем повторно войти в систему.

Я использую идентификатор ядра .net и serveridentity4 в качестве сервера, а mvc .net core в качестве сервераклиент.

Итак, у меня есть действие на сервере, чтобы справиться с этим.

    [HttpPut]
    public async Task<IActionResult> UpdateShopClaim(int id)
    {
        if (id <= 0)
        {
            return Ok(new ServiceBaseResponse(0, "shop id not found", null));
        }

        var user = await _userManager.GetUserAsync(User);
        var claims = await _userManager.GetClaimsAsync(user);
        var shop = claims.FirstOrDefault(c => c.Type == "LoginShop");
        if (shop == null)
        {
            await _userManager.AddClaimAsync(user, new Claim("LoginShop", id.ToString()));
        }
        else
        {

            await _userManager.ReplaceClaimAsync(user, shop, new Claim("LoginShop", id.ToString()));
        }

        return Ok(new ServiceBaseResponse(1, "ok", null));
    }

, а код клиента

    public async Task<ServiceResponseBase> SelectShop(ApplicationUser user, int shopId)
    {
        try
        {
            HttpContent httpContent = new StringContent("{\"id\":" + shopId + "}");
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            var uri = API.Shop.SelectShop(_remoteIdentityUrl, shopId);
            HttpRequestMessage request=new HttpRequestMessage();
            request.Method = HttpMethod.Put;
            request.RequestUri = new Uri(uri);
            request.Content = httpContent;
            var response = await _httpClient.SendAsync(request);
            response.EnsureSuccessStatusCode();
            var qa = JsonConvert.DeserializeObject<ServiceResponseBase>(await response.Content.ReadAsStringAsync());
            return qa;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

Я всегда получаю нулевое значениеControllerBase.User на сервере.

Что-то не так со мной?

1 Ответ

0 голосов
/ 20 января 2019

Несмотря на то, что здесь вы добавляете HTTP-заголовок «ContentType»:

httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

Вы не добавили заголовок запроса «Cookie» вместе с сопровождающим cookie-файлом, полученным в ответе на ваш первоначальный запрос аутентификации.Без файла cookie IdentityServer не знает, кто является клиентом, и всегда будет иметь базовое значение «Пользователь», используемое при обработке запроса.

Подробнее о заголовке «Cookie» можно узнать здесь:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie

...