두 번째 로그인은 첫 번째 로그인 MVC 이후 무한 리디렉션 루프를 발생시킵니다.NET 5 OWIN 추가 오픈IDC 연결
첫 번째 게시물이니 부드럽게 하세요! :)
저는 MVC를 개발하고 있습니다.오피스 365용 NET 5 웹 앱이며 오픈을 사용하고 있습니다.프레임워크를 연결합니다.OWIN(3) 및 ADAL(2)과 Azure AD Application을 설정했습니다.사용자가 수행한 로그인이 없습니다. 홈 컨트롤러에 [Authorize] 특성이 연결되어 있으므로 즉시 로그인이 Azure AD로 리디렉션됩니다.인증 특성에서 역할을 사용하지 않습니다.
문제:앱에 성공적으로 로그인 할 수 있습니다 - ONCE! 첫 로그인 후 브라우저를 닫고(또는 다른 기기에서 새 브라우저를 엽니다) 앱을 다시 누릅니다.그것은 내가 로그인하는 Azure AD 로그인 화면으로 나를 리디렉션하고, 내가 악명 높은 400개의 헤더를 긴 이슈로 가져올 때까지 앱과 Azure 사이에서 계속 리디렉션합니다.쿠키 가게를 들여다보니 넌센스가 가득합니다.저는 캐시(토큰캐시를 사용하고 있었지만, 비토리오의 EFADAL캐시 레시피)를 확인합니다.기본 공유(이 문제가 발견되었을 때 공유) 및 수백 개의 캐시 데이터 행(성공적인 로그인으로 생성된 행은 하나뿐)이 있습니다.
리디렉션이 출력 창을 통해 발생하면 각 왕복에서 새 액세스 및 새로 고침 토큰이 생성되는 것을 확인할 수 있습니다.
Microsoft.IdentityModel.Clients.ActiveDirectory Verbose: 1 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - AcquireTokenByAuthorizationCodeHandler: Resource value in the token response was used for storing tokens in the cache
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - AcquireTokenByAuthorizationCodeHandler: Resource value in the token response was used for storing tokens in the cache
Microsoft.IdentityModel.Clients.ActiveDirectory Information: 2 : 31/07/2015 12:31:52: - TokenCache: Deserialized 1 items to token cache.
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: - TokenCache: Deserialized 1 items to token cache.
Microsoft.IdentityModel.Clients.ActiveDirectory Verbose: 1 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: Storing token in the cache...
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: Storing token in the cache...
Microsoft.IdentityModel.Clients.ActiveDirectory Verbose: 1 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: An item was stored in the cache
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: An item was stored in the cache
Microsoft.IdentityModel.Clients.ActiveDirectory Information: 2 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - AcquireTokenHandlerBase: === Token Acquisition finished successfully. An access token was retuned:
Access Token Hash: PN5HoBHPlhhHIf1lxZhEWb4B4Hli69UKgcle0w7ssvo=
Refresh Token Hash: 3xmypXCO6MIMS9qUV+37uPD4kPip9WDH6Ex29GdWL88=
Expiration Time: 31/07/2015 13:31:51 +00:00
User Hash: GAWUtY8c4EKcJnsHrO6NOzwcQDMW64z5BNOvVIl1vAI=
OpenIdConnect에서 수신된 인증 코드 알림문제가 발생할 때 AuthenticationOptions(인증 옵션)가 표시되므로 Azure는 로그인이 성공적이었다고 생각합니다(그렇지 않으면 앱으로 다시 리디렉션되지 않습니다).
private static void PrepO365Auth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
//Configure OpenIDConnect, register callbacks for OpenIDConnect Notifications
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigHelper.ClientId,
Authority = authority,
PostLogoutRedirectUri = "https://localhost:44300/Account/SignedOut",
RedirectUri = "https://localhost:44300/",
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = (context) =>
{
ClientCredential credential = new ClientCredential(ConfigHelper.ClientId, ConfigHelper.AppKey);
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(authority, new EFADALTokenCache(signedInUserID)); // TokenCache.DefaultShared Probably need a persistent token cache to handle app restarts etc
AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
context.Code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, ConfigHelper.GraphResourceId);
return Task.FromResult(0);
},
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error/ShowError?signIn=true&errorMessage=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
}
}
Authorized 속성을 Authorized 속성에서 상속받아 Authorized 속성을 사용자 고유의 Auth 속성으로 교체하여 Authorized 코드로 들어가 상황을 확인할 수 있도록 했습니다.저는 MVC 5의 소스 코드 버전 5에서 PDB 파일을 구축했지만, 발생하는 모든 것은 그것이 제 자신의 코드로 다시 점프한다는 것입니다. :( 즉, 저는 제가 할 수 있는 것을 오버라이드했고 그 필터 Context를 찾았습니다.HttpContext입니다.사용자. 신원.IsAuthenticated는 false이며, 이는 Azure로 리디렉션되어 다시 로그인하는 원인이 됩니다.
그래서, 나는 알고 있습니다:
- Azure가 내 로그인을 수락하고 관련 토큰을 반환하는 중입니다.
- 두 번째 로그인 시 OnAuthorization 이전에 Context 필터를 지정합니다.HttpContext입니다.사용자. 신원.IsAuthenticated에서 false를 반환합니다.
- 내 Azure 응용 프로그램 구성이 정상이거나, 전혀 인증되지 않습니다.
내 생각엔:
- MVC Identity 설정에 잘못된 것이 있습니다.Azure가 제대로 작동하지 않거나 인증이 전혀 되지 않습니다.
- 다른 컴퓨터에서 두 번째 로그인을 수행하는 경우 문제가 발생하므로 쿠키 문제가 아닙니다.
죄송하지만, 이런 무한 리다이렉트 문제가 너무 많아서 제 상황이 왜 달랐는지 설명해야 했어요!
제가 찾고 있는 것은 (대답이 아니라면!) 디버그를 더 할 수 있는 방법에 대한 올바른 방향으로의 푸시하는 것입니다.
도움을 주셔서 감사합니다!
앤디
관심 있는 모든 사람들을 위한 답을 찾았습니다.카타나 쿠키 매니저와 ASP가 있는 카타나의 알려진 버그입니다.NET 쿠키 관리자는 서로의 쿠키를 충돌시키고 덮어씁니다.전체 세부 정보 및 해결 방법:
아래 표시된 시스템 웹 쿠키 관리자는 이제 Microsoft에서 찾을 수 있습니다.오윈. 진행자.시스템 웹 Nuget 패키지입니다.
CodePlex가 종료될 때 코드 추가:
//stick this in public void ConfigureAuth(IAppBuilder app)
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
// ...
CookieManager = new SystemWebCookieManager()
});
//And create this class elsewhere:
public class SystemWebCookieManager : ICookieManager
{
public string GetRequestCookie(IOwinContext context, string key)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
var cookie = webContext.Request.Cookies[key];
return cookie == null ? null : cookie.Value;
}
public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (options == null)
{
throw new ArgumentNullException("options");
}
var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
bool pathHasValue = !string.IsNullOrEmpty(options.Path);
bool expiresHasValue = options.Expires.HasValue;
var cookie = new HttpCookie(key, value);
if (domainHasValue)
{
cookie.Domain = options.Domain;
}
if (pathHasValue)
{
cookie.Path = options.Path;
}
if (expiresHasValue)
{
cookie.Expires = options.Expires.Value;
}
if (options.Secure)
{
cookie.Secure = true;
}
if (options.HttpOnly)
{
cookie.HttpOnly = true;
}
webContext.Response.AppendCookie(cookie);
}
public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (options == null)
{
throw new ArgumentNullException("options");
}
AppendResponseCookie(
context,
key,
string.Empty,
new CookieOptions
{
Path = options.Path,
Domain = options.Domain,
Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
}
}
저도 요점을 파악했습니다: https://gist.github.com/irwinwilliams/823f43ef8a5e8019a95874049dbb8b00
이 문제가 발생하여 인터넷에 모든 수정 사항을 적용했습니다.아무 것도 작동하지 않았고, 저는 들어가서 제 쿠키를 보았습니다.그것은 매우 컸다.Owin 미들웨어가 이를 잘라낸 다음 [Authorize] 특성이 ID를 확인할 수 없습니다. -> 사용자를 oidc로 보내기 -> ID good -> 클라이언트로 리디렉션 -> 쿠키 잘라내기 -> 확인할 수 없습니다. -> [Authorize] -> 사용자를 oidc로 보내기 -> 등에서 확인할 수 없습니다.
수정 사항은 마이크로소프트에 있었습니다.오윈. 진행자.SystemWeb 3.1.0.0 및 SystemWebChunkingCookieManager를 사용합니다.
쿠키를 쪼개서 함께 구문 분석합니다.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
CookieManager = new Microsoft.Owin.Host.SystemWeb.SystemWebChunkingCookieManager()
});
문제가 정확히 설명된 것은 아니지만, OpenId connect 기반 로그인 중에 DEV 머신에서도 리디렉션 루프가 발생했습니다.
저의 경우 쿠키에 대한 단순한 오류였습니다.저는 HTTP를 통해 보호된 URL에 접속하고 있었습니다.HTTPS를 통해 종속 당사자의 보호된 URL에 액세스하고 있는지 확인합니다.
인증이 완료되면 인증 쿠키는 HTTPS를 통해서만 전송됩니다. 즉, HTTP를 통해 보호된 URL에 액세스할 때 브라우저는 사용자의 인증 쿠키를 요청과 함께 전송하지 않으므로 서버는 사용자를 인증되지 않은 것으로 간주합니다.이 시점에서 서버는 사용자를 이미 로그인한 인증 서버로 리디렉션합니다.인증 서버는 사용자를 원래 URL로 다시 리디렉션하여 리디렉션 루프를 보장합니다.
인증과 같은 기능이 있는 경우 앱에서 항상 all-SSL을 사용해야 하기 때문에 배포 환경에서는 절대 그렇지 않습니다.이렇게 하면 세션 가로채기의 위험이 줄어듭니다.
저도 똑같은 문제를 겪었습니다.다른 종속성으로 인해 URL을 HTTP에서 HTTPS로 변경할 수 없습니다.global.asax.cs 에서 session_start 및 session_end를 추가하여 최종 해결됨
protected void Session_Start(object sender, EventArgs e)
{
// event is raised each time a new session is created
}
protected void Session_End(object sender, EventArgs e)
{
// event is raised when a session is abandoned or expires
}
아래 코드는 Golbal.asax.cs 파일에 세션 이벤트를 추가하여 문제를 해결했습니다.
protected void Session_Start(object sender, EventArgs e)
{
// event is raised each time a new session is created
}
protected void Session_End(object sender, EventArgs e)
{
// event is raised when a session is abandoned or expires
}
그리고 아래 코드를 공개적으로 추가함으로써 스타트업의 ConfigureAuth(IAppBuilder 앱) 메서드를 무효화합니다.Auth.cs 파일
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
CookieManager = new Microsoft.Owin.Host.SystemWeb.SystemWebChunkingCookieManager()
});
언급URL : https://stackoverflow.com/questions/31747008/second-sign-in-causes-infinite-redirect-loop-after-the-first-successful-login-mv
'programing' 카테고리의 다른 글
Azure 가상 시스템 간의 공유 드라이브 (0) | 2023.04.28 |
---|---|
Azure Git에 대한 인증 실패 (0) | 2023.04.28 |
Azure 함수가 존재하는 동일한 폴더에서 File을 읽을 수 있습니까? (0) | 2023.04.28 |
'Microsoft' 파일 또는 어셈블리를 로드할 수 없습니다.오윈. 보안.쿠키' 또는 쿠키 종속성 중 하나입니다. (0) | 2023.04.28 |
Git 1.7+에서 모든 원격 지점을 나열하려면 어떻게 해야 합니까? (0) | 2023.04.28 |