После лотов проб и ошибок я наконец-то разобрался с недостающими частями.
Сначала я изменил options.ResponseType
на OpenIdConnectResponseType.IdTokenToken
, который, как я понимаю, возвращает IdToken, а также токен (токен доступа). Это требует предоставления ресурса, для которого будет использоваться токен доступа.
Итак, я также добавил options.Resource
со значением "https://graph.microsoft.com"
.
Я тоже удалил options.GetClaimsFromUserInfoEndpoint = true;
Мне также пришлось обновить манифест приложения в Azure, чтобы изменить oauth2AllowImplicitFlow
на true
.
Наконец, я заменил событие OnAuthorizationCodeRecevied
на OnTokenValidated
как точку, из которой я вызываю своего помощника Microsoft Graph.
Эта комбинация изменений привела к успешному получению токена доступа, который я мог затем передать своему помощнику Microsoft Graph и получить то, что мне нужно.
Последний метод Configure
теперь выглядит следующим образом:
public void Configure(string name, OpenIdConnectOptions options)
{
options.ClientId = _azureOptions.ClientId;
options.Resource = "https://graph.microsoft.com";
options.Authority = $"{_azureOptions.Instance}";
options.UseTokenLifetime = true;
options.CallbackPath = _azureOptions.CallbackPath;
options.RequireHttpsMetadata = true;
options.ResponseType = OpenIdConnectResponseType.IdTokenToken;
options.SaveTokens = true;
options.TokenValidationParameters.ValidateIssuer = true;
options.TokenValidationParameters.IssuerValidator = ValidateIssuer;
options.Events.OnAuthenticationFailed = AuthenticationFailed;
options.Events.OnTokenValidated = TokenValidatedAsync;
}
И TokenValidatedAsync
теперь имеет токен доступа, найденный в TokenValidatedContext.ProtocolMessage.AccessToken
:
private static async Task TokenValidatedAsync(
TokenValidatedContext context)
{
string accessToken = context.ProtocolMessage.AccessToken;
Graph.User userDetails = await MyProject.Helpers.Graph
.GetUserDetailsAsync(accessToken);
}
Отсюда я могу делать то, что мне нужно, с помощью пользовательских данных Microsoft Graph.
Я не смог найти ни одного рабочего примера, поэтому оставлю это здесь для дальнейшего использования.