Я пытался добавить Предоставление кода авторизации к существующему решению, которое использует ASP.net Identity 2.2.2.
На основе Пример кода Я настроил Аутентификацию cookie в **Startup.Auth.cs**
следующим образом:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Application",
AuthenticationMode = AuthenticationMode.Passive,
LoginPath = new PathString("/Oauth/Login"),
LogoutPath = new PathString("/Oauth/Logout"),
CookieName = CookieAuthenticationDefaults.CookiePrefix + "SuperSecretName",
});
В OAuthController.cs
я использовал код из MS Demo Solution:
public async Task<ActionResult> Authorize()
{
try
{
if (Response.StatusCode != 200)
{
return RedirectToAction("AuthorizeError");
}
var authentication = HttpContext.GetOwinContext().Authentication;
if (authentication == null)
{
throw new Exception("Authentication Middleware not available.");
}
var ticket = await authentication.AuthenticateAsync("Application");
var identity = ticket != null ? ticket.Identity : null;
if (identity == null)
{
authentication.Challenge("Application");
return new HttpUnauthorizedResult();
}
var scopes = (Request.QueryString.Get("scope") ?? "").Split(' ');
if (Request.HttpMethod == "POST")
{
if (!string.IsNullOrEmpty(Request.Form.Get("submit.Grant")))
{
identity = new ClaimsIdentity(identity.Claims, "Bearer", identity.NameClaimType, identity.RoleClaimType);
foreach (var scope in scopes)
{
identity.AddClaim(new Claim("urn:oauth:scope", scope));
}
authentication.SignIn(identity);
}
if (!string.IsNullOrEmpty(Request.Form.Get("submit.Login")))
{
authentication.SignOut("Application");
authentication.Challenge("Application");
return new HttpUnauthorizedResult();
}
}
return View();
}
catch(Exception ex)
{
throw;
}
}
При использовании компиляции "DEBUG" приложение ведет себя как ожидалось:
После успешного входа в систему приложение перенаправляет пользователя обратно по HTTP 302, и клиент получает Access- и Refresh-Token.
В режиме «RELEASE» перенаправление по HTTP 302 завершается неудачно (без исключения). Вместо 302 я вижу 401, и процесс застрял.
Документация CookieAuthenticationOptions
сообщает, что промежуточное программное обеспечение автоматически переключается с 401 на 302, когда установлен параметр LoginPath
.
Свойство LoginPath сообщает промежуточному программному обеспечению, что оно должно изменить исходящий код несанкционированного статуса 401 на перенаправление 302 на указанный путь входа в систему. Текущий URL, который сгенерировал 401, добавляется в LoginPath как параметр строки запроса, названный ReturnUrlParameter.
Как только запрос к LoginPath предоставляет новый идентификатор SignIn, значение ReturnUrlParameter используется для перенаправления браузера обратно на URL, который вызвал исходный неавторизованный код состояния. Если значение LoginPath пустое или пустое, промежуточное ПО не будет искать 401 кодов неавторизованного состояния и не будет автоматически перенаправляться при входе в систему.
Использование MS Demo App дает тот же результат при переключении из режима «DEBUG» в режим «RELEASE».
Есть предложения?
Заранее спасибо,
Christian