Итак, я сделал DLL для генерации токена аутентификации в C# (.NET Framework v4.8) с тестовым пользовательским интерфейсом, чтобы проверить, что он работает, что делает. Появляется экран входа в систему, я могу войти в систему и генерировать токен аутентификации. Тем не менее, когда я запускаю один и тот же метод в OpenEdge, я получаю «ссылку на объект, не установленную на экземпляр объекта». «Ошибка.
Я сначала подумал, что она связана с переменной FirstAccount , когда она возвращает нулевое значение при установке. Я проверил переменные, когда они запускаются в C# и в OpenEdge с USEASYNC установить как false , так и True , и они в конечном итоге одинаковы, но OpenEdge жалуются, что нулевое значение передается, а C# не. Затем я добавил в проверку, если первая переменная является нулевой, так что она пропускает учетную запись молча и переходит прямо в интерактивную, но я все еще получаю ту же ошибку даже с .withaccount (FirstAccount) . Все остальное имеет ценность и то же самое между C# и OpenEdge. Логин запускается путем вызова метода LoginSync () как в тестовом пользовательском интерфейсе, так и в OpenEdge. У кого -нибудь есть идеи относительно того, почему это делает это и как это исправить? < /P>
Метод аутентификации: < /p>
public IPublicClientApplication App {
get {
if (_app == null)
{
BuildApp();
}
return _app;
}
}
public BaseRequests Client
{
get
{
if (_client == null)
{
BuildClient();
}
return _client;
}
}
public void BuildApp()
{
_app = null;
_app = PublicClientApplicationBuilder.Create(_clientId)
.WithAuthority(AzureCloudInstance.AzurePublic, _tenantId)
.WithDefaultRedirectUri()
.Build();
}
public string BuildClient()
{
var token = GetAccessToken(true);
_client = new BaseRequests(_baseURL, token);
return token;
}
public string LoginSync()
{
BuildApp();
return BuildClient();
}
private string GetAccessToken(bool useAsync)
{
if (useAsync)
{
return Task.Run(() => GetAccessTokenAsync()).GetAwaiter().GetResult();
}
AuthenticationResult authResult = null;
IPublicClientApplication app = App;
var accounts = Task.Run(() => app.GetAccountsAsync()).GetAwaiter().GetResult();
IAccount firstAccount = accounts.FirstOrDefault();
try
{
if (firstAccount != null)
{
try
{
authResult = Task.Run(() => app.AcquireTokenSilent(_scopes, firstAccount)
.ExecuteAsync()
).GetAwaiter().GetResult();
}
catch (Exception ex)
{
return $"Error Acquiring Token Silently:{Environment.NewLine}{ex}";
}
}
else
{
try
{
authResult = Task.Run(() =>
app.AcquireTokenInteractive(_scopes)
.WithAccount(firstAccount)
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync()
).GetAwaiter().GetResult();
}
catch (MsalException msalex)
{
return $"Error Acquiring Token:{Environment.NewLine}{msalex}";
}
}
}
catch (Exception ex)
{
return $"Error Acquiring Token{Environment.NewLine}{ex}";
}
return authResult.AccessToken;
}
private async Task GetAccessTokenAsync()
{
AuthenticationResult authResult = null;
IPublicClientApplication app = App;
var accounts = await app.GetAccountsAsync();
var firstAccount = accounts.FirstOrDefault();
try
{
authResult = await app.AcquireTokenSilent(_scopes, firstAccount)
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
try
{
authResult = await app.AcquireTokenInteractive(_scopes)
.WithAccount(firstAccount)
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync();
}
catch (MsalException msalex)
{
return $"Error Acquiring Token:{Environment.NewLine}{msalex}";
}
}
catch (Exception ex)
{
return $"Error Acquiring Token Silently:{Environment.NewLine}{ex}";
}
return authResult.AccessToken;
}
< /code>
Stack Trace: < /p>
This exception was originally thrown at this call stack:
at Microsoft.Identity.Client.Platforms.Features.OpenTelemetry.OtelInstrumentation..ctor()
at Microsoft.Identity.Client.PlatformsCommon.Shared.AbstractPlatformProxy.InternalGetOtelInstrumentation()
at System.Lazy`1.CreateValue() in System\Lazy.cs:line 319
at System.Lazy`1.LazyInitValue() in System\Lazy.cs:line 273
at Microsoft.Identity.Client.Internal.Requests.RequestBase.LogFailureTelemetryToOtel(String errorCodeToLog, ApiEvent apiEvent, CacheRefreshReason cacheRefreshReason)
at Microsoft.Identity.Client.Internal.Requests.RequestBase.d__11.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() in System.Runtime.ExceptionServices\ExceptionDispatchInfo.cs:line 72
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) in System.Runtime.CompilerServices\TaskAwaiter.cs:line 88
at Microsoft.Identity.Client.ApiConfig.Executors.ClientApplicationBaseExecutor.d__2.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() in System.Runtime.ExceptionServices\ExceptionDispatchInfo.cs:line 72
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) in System.Runtime.CompilerServices\TaskAwaiter.cs:line 88
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() in System.Runtime.CompilerServices\TaskAwaiter.cs:line 230
at MailServiceWrapper.MailServiceHelper.d__28.MoveNext() in ...\MailServiceWrapper\MailServiceHelper.cs:line 116
Подробнее здесь: https://stackoverflow.com/questions/795 ... ct-referen
Аутентификация MSAL.NET работает в C#, но не OpenEdge 12.8 - «Ссылка на объект не установлен на экземпляр объекта». ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ссылка на объект не установлен на экземпляр объекта Visual Studio asp.net
Anonymous » » в форуме MySql - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-