Файл cookie с утверждениями, не установленными на рабочем сервере

Я использую IdentityServer3 вместе с приложением веб-форм, мне удалось воспроизвести получение id_token на моем локальном компьютере после Клиент MVC без библиотеки. Мой полный исходный код размещен на GitHub как IdServer3-WebFormsAppDemo.

Однако при переходе на фактический рабочий сервер кажется, что приложение не может устанавливать претензии. Это обратный вызов, который обрабатывает вход в систему cookie (сразу после того, как пользователь аутентифицируется и дает согласие):

// AuthorizationCallback.aspx
private async Task ProcessRequest () {
    var idToken = Request.Form["id_token"];
    var state = Request.Form["state"];

    if (idToken == null) {
        throw new InvalidOperationException("invalid id_token");
    }

    var claims = await ValidateIdentityTokenAsync(idToken, state);
    var claimsIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
    claimsIdentity.AddClaim(new Claim("id_token", idToken));
    Request.GetOwinContext().Authentication.SignIn(claimsIdentity);

    Response.Redirect("/");
}

После проверки токена и входа в файл cookie приложение перенаправляется на другую форму и отображает утверждения id_token:

// Default.aspx
protected void Page_Load (object sender, EventArgs e) {
    heading.InnerText = Page.User.Identity.IsAuthenticated ? "User Is Authenticated" : "User Is Not Authenticated";
    foreach (var claim in Request.GetOwinContext().Authentication.User.Claims) {
    AddListElement(claim.Type, claim.Value);
    }
}

Я могу подтвердить, что токен успешно проходит проверку на AuthorizationCallback.aspx и утверждения получены, при перенаправлении на Default.aspx утверждения отображаются при локальном тестировании, но не при тестировании с рабочего сервера.

Page.User.Identity.IsAuthenticated всегда имеет значение false, и в объекте User нет сохраненных утверждений. При проверке в моем браузере я вижу эти 2 файла cookie в заголовках ответа:

set-cookie:.AspNet.TempCookie=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT
set-cookie:.AspNet.ApplicationCookie=fyMP9H ... Gt-7VlTA; path=/; secure; HttpOnly

Но только при тестировании приложения с localhost на рабочем сервере эти файлы cookie отсутствуют. Что может быть причиной такого поведения? Любая помощь или подсказка будут оценены.


person chouzar    schedule 08.10.2016    source источник


Ответы (1)


Кажется, я только что обнаружил причину проблемы. Моя форма AuthorizationCallback.aspx была настроена таким образом, чтобы она могла обрабатывать асинхронные методы:

// AuthorizationCallback.aspx.cs
protected void Page_Load (object sender, EventArgs e) {
    // Needed in order to process ValidateIdentityTokenAsync below
    RegisterAsyncTask(new PageAsyncTask(ProcessRequest));
}

private async Task ProcessRequest () {
    var idToken = Request.Form["id_token"];
    ...
    var claims = await ValidateIdentityTokenAsync(idToken, state);
    ...
}

Изменив форму, чтобы она не обрабатывала асинхронные запросы, я смог заставить утверждения работать на меня:

protected void Page_Load (object sender, EventArgs e) {
    var idToken = Request.Form["id_token"];
    ...
    var task = Task.Run(async () =>
        await ValidateIdentityTokenAsync(idToken, state)
    );
    var claims = task.Result;
    ....
}

Я до сих пор не уверен, почему это изменение решило мою проблему, но я предполагаю, что это связано с выходом асинхронных методов перед входом в систему? Теперь, когда у меня есть процедура блокировки, проблема больше не возникает.

person chouzar    schedule 08.10.2016