Когда претензии доступны

Я добавляю утверждение в метод GenerateUserIdentityAsync:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

            userIdentity.AddClaim(new Claim(ClaimsStaticStrings.Inactivity, company.Inactivity.ToString()));

        return userIdentity;
    }
}

Затем я пытаюсь получить его в методе Account/Login:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                int inactivity = Utils.GetInactivityFromIdentity(User.Identity);
                Response.Cookies.Add(new HttpCookie("inactivity", inactivity.ToString()));

                return RedirectToAction("Index", "Home");
        }
    }


    public static int GetInactivityFromIdentity(IIdentity identity)
    {
        System.Security.Claims.ClaimsIdentity claims = (System.Security.Claims.ClaimsIdentity)identity;

        var claim = claims.FindFirst(Models.ClaimsStaticStrings.Inactivity);

        if (claim != null)
        {
            return int.Parse(claim.Value);
        }
        else
            throw new Exception("Inactivity is not set");

    }

он выдает исключение «Неактивность не установлена». переменная 'claims' имеет только одно утверждение - name

Но когда я вызываю метод GetInactivityFromIdentity с любой другой страницы (после перенаправления) - он работает нормально (и претензии заполняются всеми установленными претензиями). Почему так?


person Oleg Sh    schedule 01.08.2017    source источник
comment
что это? ClaimsStaticStrings.Inactivity какой-то настраиваемый список строк, которые вы предопределили, роли/претензии для пользователей JAVA/C++? я имею в виду, что я начал смешивать mongoDB и идентичность Microsoft, затем вскоре произошло много всего, и спустя столько времени я все забыл, и трудно все знать ... должен ли я предъявлять претензии? или нет? когда ты это делаешь? например, только для основных пользователей (основатель) или ... когда использовать роли? я должен пройти это вообще? первому пользователю? или все?   -  person deadManN    schedule 17.04.2018


Ответы (1)


Заявки сериализуются в auth-cookie. Файл cookie не устанавливается до тех пор, пока вы не выполните перезагрузку страницы при аутентификации. В момент, когда вы пытаетесь получить доступ к утверждениям из файла cookie, в HTTP-запросе нет файла cookie — SignInManager будет устанавливать файл cookie только после завершения запроса, но не сразу после этого. Вам действительно нужен цикл перенаправления/перезагрузки страницы, чтобы получить доступ к файлам cookie и претензии.

Вам придется каким-то образом получить значение inactivity не через претензию, а из вашего хранилища данных при входе пользователей.

person trailmax    schedule 02.08.2017