현재 ASP.NET Core 2.2 웹 API를 기존 Azure AD에 연결하는 데 어려움을 겪고 있습니다. 저는 ASP.NET Core 팀 의이 샘플 코드 를 기반으로 구성 했습니다. 쿠키는 JWT로 대체되었습니다.
이제 다음과 같은 오류 메시지가 나타납니다.
IOException: IDX10804: Unable to retrieve document from: {MetadataAdress}.
- Microsoft.IdentityModel.Protocols.HttpDocumentRetriever+<GetDocumentAsync>d__8.MoveNext()
- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
- System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
- Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever
+<GetAsync>d__3.MoveNext()
- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
- System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
- Microsoft.IdentityModel.Protocols.ConfigurationManager+<GetConfigurationAsync>d__24.MoveNext()
URL을 직접 호출하면 구성 파일과 함께 즉각적인 응답을받습니다. 그러나 코드는 그것을 할 수없는 것 같습니다. 이유가 무엇인지 잘 모르겠습니다.
이 문제의 가장 가능성있는 원인은 구성 실수입니다. 필드의 구문을 잘못했거나 중요한 값이 누락되었을 수 있습니다.
연결 정보 필드는 다음과 같이 제공됩니다.
TenantId: {Tenant-GUID}
Authority: https://login.microsoftonline.com/{TenantId}
Resource: https://{resource-endpoint}.{resource-domain}
ClientId: {Client-GUID}
ClientSecret: {ClientSecret}
의 인증 서비스 구성은 Startup.cs
다음과 같습니다.
services
.AddAuthentication(options => {
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddJwtBearer()
.AddOpenIdConnect(options => {
options.ClientId = this.ClientId;
options.ClientSecret = this.ClientSecret;
options.Authority = this.Authority;
options.Resource = this.Resource;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.SignedOutRedirectUri = "/signed-out";
options.Events = new OpenIdConnectEvents()
{
OnAuthorizationCodeReceived = async context =>
{
var request = context.HttpContext.Request;
var currentUri = UriHelper.BuildAbsolute(
request.Scheme, request.Host, request.PathBase, request.Path
);
var credentials = new ClientCredential(this.ClientId, this.ClientSecret);
var authContext = new AuthenticationContext(
this.Authority,
AuthPropertiesTokenCache.ForCodeRedemption(context.Properties)
);
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(
context.ProtocolMessage.Code,
new System.Uri(currentUri),
credentials,
this.Resource
);
context.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
};
// Custom
options.MetadataAddress = $"{this.Authority}/federationmetadata/2007-06/federationmetadata.xml";
options.RequireHttpsMetadata = false; // Dev env only
}
이 Azure AD에 연결하는 기존 웹 API가 많이 있습니다. 슬프게도 그들은 모두 완전한 .NET Framework를 사용하고 있습니다. 그들은 사용 UseWindowsAzureActiveDirectoryBearerAuthentication
로부터 방법 Microsoft.Owin.Security.ActiveDirectory
네임 스페이스의를 WindowsAzureActiveDirectoryBearerAuthenticationExtensions
.
그들이 사용하는 또 다른 것은 HostAuthenticationFilter
인증 유형이 Bearer
.
무엇이 문제입니까?
이 문제를 어떻게 해결할 수 있습니까?
이러한 구성 요소를 함께 사용하려면 어떻게해야합니까?
몇 가지 테스트 후 문제를 식별 할 수있었습니다. 분명히이 문제의 주요 원인은 네트워크 관련이었습니다. 우리 회사에서 무제한 네트워크로 전환했을 때 인증이 성공했습니다.
프록시를 구성 JwtBearer
하고 OpenIdConnect
미들웨어에 제공해야했습니다 . 이것은 다음과 같습니다.
var proxy = new HttpClientHandler
{
Proxy = new WebProxy("{ProxyUrl}:{ProxyPort}") { UseDefaultCredentials = true; },
UseDefaultCredentials = true
};
services
.AddJwtBearer(options => {
// ... other configuration steps ...
options.BackchannelHttpHandler = proxy;
})
.AddOpenIdConnect(options => {
// ... other configuration steps ...
options.BackchannelHttpHandler = proxy;
})
@astaykov는 메타 데이터 주소가 실제로 올바르지 않다는 것이 옳았습니다. 이 느낌도 있었지만 이전 API가 성공적으로 실행 되었기 때문에 유지했습니다. 문제 테스트 중에도 제거했지만 네트워크 문제로 인해 차이가 발생하지 않았습니다.
네트워크 문제가 해결 된 후 기본 메타 데이터 주소 사용이 작동했습니다. 다른 인증 스키마를 사용할 때 예상대로 사용자 지정 실패했습니다.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加