Microsoft 계정으로 사용자를 인증 할 때 문제가 있습니다. OpenId 연결 인증을 사용하고 있지만 AcquireTokenByAuthorizationCodeAsync 메서드를 호출하면 다음 메시지가 표시됩니다.'AADSTS70000 : 전송 데이터 구문 분석기 오류 : 인증 코드 형식이 잘못되었거나 잘못되었습니다.
예외 발생 : System.Private.CoreLib.dll에서 'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException': 'AADSTS70000 : 전송 데이터 파서 실패 : 인증 코드가 잘못되었거나 유효하지 않습니다.
정식 옵션은 다음과 같은 것들이다 :
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
}).AddOpenIdConnect(openIdOptions =>
{
openIdOptions.ResponseType = OpenIdConnectResponseType.CodeIdToken;
openIdOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
openIdOptions.Authority = String.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/{0}{1}", "common", "/v2.0");
openIdOptions.ClientId = Configuration["MicrosoftAuth:ClientId"];
openIdOptions.ClientSecret = Configuration["MicrosoftAuth:ClientSecret"];
openIdOptions.SaveTokens = true;
openIdOptions.TokenValidationParameters = new TokenValidationParameters{
ValidateIssuer = false
};
var scopes = Configuration["MicrosoftAuth:Scopes"].Split(' ');
foreach (string scope in scopes){
openIdOptions.Scope.Add(scope);
}
openIdOptions.Events = new OpenIdConnectEvents{
OnAuthorizationCodeReceived = async (context) =>
{
var code = context.ProtocolMessage.Code;
var identifier = context.Principal.Claims.First(item => item.Type == ObjectIdentifierType).Value;
IMemoryCache memoryCache = context.HttpContext.RequestServices.GetRequiredService<IMemoryCache>();
var result = await GetTokenByAuthorizationCodeAsync(identifier, code, memoryCache);
context.HandleCodeRedemption(result.AccessToken, result.IdToken);
},
};
});
그리고 이것은 내 GetTokenByAuthorizationCodeAsync (나는 그냥 일을 만들려고 노력, 그것은 꽤하지 알고)과 같은 모습입니다 :
public async Task<AuthenticationResult> GetTokenByAuthorizationCodeAsync(string userId, string code, IMemoryCache memoryCache)
{
TokenCache userTokenCache = new SessionTokenCache(userId, memoryCache).GetCacheInstance();
try
{
AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/common/oauth2/v2.0/token/", userTokenCache);
ClientCredential credential = new ClientCredential(Configuration["MicrosoftAuth:ClientId"], Configuration["MicrosoftAuth:ClientSecret"]);
string[] scope = new List<String>().Append("https://graph.windows.net").ToArray();
AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code,new Uri(Configuration["MicrosoftAuth:RedirectUri"]), credential, Configuration["MicrosoftAuth:ResourceId"]);
return result;
}
catch (Exception)
{
return null;
}
}
나는이 오류의 원인이 무엇인지 전혀 모른다. 우편 발송자 요청을 보내면 인증 코드를 사용할 수 있지만 요청에 리소스 ID를 추가 할 수는 없습니다.
저는 Microsoft의 응용 프로그램 등록 포털 (https://apps.dev.microsoft.com/)에 응용 프로그램을 등록했습니다.
안녕하세요! 도와 줘서 고마워. MSAL 패키지를 설치했는데 지금 구매하면 스코프에 문제가 있습니다. 다음 메시지가 나타납니다. "AADSTS70000 : 요청한 하나 이상의 범위가 승인되지 않았거나 만료되어 요청이 거부되었습니다. 사용자가 먼저 로그인하여 요청 된 범위에 클라이언트 응용 프로그램 액세스 권한을 부여해야합니다." CCA에 정의 된 범위와 관련이 있다고 생각했지만 var 결과 행에 추가하면 동일한 문제가 발생합니다. 범위는 응용 프로그램 등록 포털에서 정의되었으므로 문제가 무엇인지 알 수는 없습니다 –
Nevermind. 나는 그것을 가능하게 만들었다. 이제 OpenId Connect로 내 사용자를 인증 할 수 있습니다. 문제는 없습니다. 앱 포털에서 openid, profile 및 offline_access 범위를 추가해야했습니다. 이제 그래프 패키지와 함께 작동하는 데 문제가 있습니다. 다른 질문을하거나 자세한 내용을 여기에 제공해야합니까? –
다른 질문에 대해서는 새로운 스레드를 다시 열어 커뮤니티가 문제를 더 쉽게 인식 할 수 있도록하는 것이 좋습니다. 그리고이 게시물이 orignal 문제에 도움이된다면 이것을 대답으로 받아 들일 수 있습니다. 그리고 같은 문제가있는 다른 커뮤니티에서는이 스레드에서 쉽게 문제를 찾을 수 있습니다. :) –