У меня есть веб-приложение ASP.NET 4.6, в котором я пытаюсь добавить OpenId Connect с помощью OWIN.
Я добавил свой класс запуска Owin, и все, кажется, настроено правильно, но проблема в том, что яИмеющий ASP Identity / Authenticated пользователь никогда не создается.Я получаю бесконечный цикл, где страница обратного вызова OpenId перенаправляет обратно на исходную страницу, которая затем перенаправляет на страницу входа в систему и т. Д.
Вот мой класс запуска:
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseKentorOwinCookieSaver();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Login.aspx"),
ExpireTimeSpan = TimeSpan.FromDays(7)
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = _clientId,
ClientSecret = _clientSecret,
Authority = _authority,
RedirectUri = _redirectUri, // LoginCallback
PostLogoutRedirectUri = "http://localhost:60624/Logout.aspx",
ResponseType = OpenIdConnectResponseType.CodeIdToken,
Scope = "openid profile email",
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name"
},
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async n =>
{
// Exchange code for access and ID tokens
var tokenClient = new TokenClient($"{_authority}/as/token.oauth2", _clientId, _clientSecret);
var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, _redirectUri);
if (tokenResponse.IsError)
{
throw new Exception(tokenResponse.Error);
}
var userInfoClient = new UserInfoClient($"{_authority}/idp/userinfo.openid");
var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);
var claims = new List<Claim>(userInfoResponse.Claims)
{
new Claim("id_token", tokenResponse.IdentityToken),
new Claim("access_token", tokenResponse.AccessToken)
};
n.AuthenticationTicket.Identity.AddClaims(claims);
//// create the identity
//var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationType);
//System.Web.HttpContext.Current.GetOwinContext().Authentication.SignIn(new AuthenticationProperties
//{
// IsPersistent = true
//}, identity);
}
}
});
}
Вот страница Login.aspx:
protected void Page_Load(object sender, EventArgs e)
{
if (!Request.IsAuthenticated)
{
HttpContext.Current.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = Request["ReturnUrl"] ?? "Default.aspx" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
Поток страниц выглядит так:
1) Запрос: http://localhost:60624/Page.aspx Ответ: 302 - перенаправление на Login.aspx
2) Запрос: http://localhost:60624/Login.aspx?ReturnUrl=%2FPage.aspx Ответ 302 - перенаправление на https://auth.myprovider.com
Некоторые файлы cookie, установленные здесь в заголовках ответа:
Set-Cookie: OpenIdConnect.nonce.KIsuj4RUmGKJIynLrkEScxBvGrZzkMo6ylZ% 2F4lRknPM% 3D = XXXXXXXXX;Путь = /;истекает = понедельник, 22 апреля 2019 года 14:12:00 по Гринвичу;HttpOnly Set-Cookie: OpenIdConnect.nonce.KIsuj4RUmGKJIynLrkEScxBvGrZzkMo6ylZ% 2F4lRknPM% 3D = ггггггггг;истекает = понедельник, 22 апреля 2019 года 14:12:00 по Гринвичу;Путь = /;HttpOnly
3) Провайдер аутентификации, вход, и он 302 перенаправляет на / LoginCallback
4) Запрос: http://localhost:60624/LoginCallback Ответ 302 - перенаправить на /Page.aspx
Здесь очищаются файлы cookie, которые были установлены на шаге 2.
Set-Cookie: OpenIdConnect.nonce.KIsuj4RUmGKJIynLrkEScxBvGrZzkMo6ylZ% 2F4lRknPM% 3D =;Путь = /;expires = Четверг, 01 января 1970 года, 00:00:00 GMT Набор файлов cookie: OpenIdConnect.nonce.KIsuj4RUmGKJIynLrkEScxBvGrZzkMo6ylZ% 2F4lRknPM% 3D =;истекает = чт, 01 января 1970 г. 00:00:00 по Гринвичу;путь = /
5) Назад к Page.aspx, пользователь не аутентифицирован;Перейти к шагу 1
Я выполнил некоторую отладку, и AuthorizationCodeReceived запускается при запуске, а бэкэнд успешно вызывает конечную точку сведений о пользователе.Я пытался вызвать System.Web.HttpContext.Current.GetOwinContext (). Authentication.SignIn () из этого уведомления, но это, похоже, ничего не делает.
На данный момент язастрял.Почему cookie-файл для аутентификации пользователя не устанавливается?Кажется, это должно происходить автоматически.Я должен вручную создать это сам?( Как я могу вручную создать файл cookie для аутентификации вместо метода по умолчанию? )
РЕДАКТИРОВАТЬ: После просмотра ответа @ Zaxxon я смог его получитьза работой.В уведомлении AuthorizationCodeReceived было 2 ошибки:
- Мне нужно было создать ClaimsIdentity.В моем исходном коде, который я представил выше, я закомментировал это, но это также было неверно.
- Мне пришлось заменить AuthenticationTicket на новый с новым идентификатором, который я только что создал.Затем добавьте претензии к этому новому идентификатору.
Вот рабочий код:
ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.GivenName, ClaimTypes.Role);
n.AuthenticationTicket = new AuthenticationTicket(identity, n.AuthenticationTicket.Properties);
n.AuthenticationTicket.Identity.AddClaims(claims);