Попробуйте что-нибудь вроде этого ...
builder.Services.AddMsalAuthentication(options =>
{
...
options.ProviderOptions.AdditionalScopesToConsent.Add(
"https://graph.microsoft.com/Mail.Send");
options.ProviderOptions.AdditionalScopesToConsent.Add(
"https://graph.microsoft.com/User.Read");
}
https://docs.microsoft.com/en-us/aspnet/core/security/blazor/webassembly/additional-scenarios?view=aspnetcore-3.1#request -additional-access-tokens
Надеюсь, это поможет!
EDIT 1: Мой клиент Program.cs
using System.Net.Http;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
Добавьте приведенную ниже ссылку на Index.html
страницу
<script src="_content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/AuthenticationService.js"></script>
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
builder.Services.AddHttpClient("BlazorWasmAADMsal.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
// Supply HttpClient instances that include access tokens when making requests to the server project
builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("BlazorWasmAADMsal.ServerAPI"));
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("api://XXXXXXXXXXXXXXXXXX/API.Access");
});
await builder.Build().RunAsync();
}
РЕДАКТИРОВАТЬ 2: Внесены незначительные изменения. Рабочий проект загружен сюда . В ответ для справки добавлен снимок экрана успешного входа в систему. : -)
РЕДАКТИРОВАТЬ 3:
Azure Active Directory (AAD) Microsoft Graph API области требуются приложению для чтения пользовательских данных и отправки почты. После добавления разрешений API Microsoft Graph на портале Azure AAD дополнительные области настраиваются в клиентском приложении.
Последний раз, когда я пропустил включенные строки ниже, я включил их в Program.cs
builder.Services.AddMsalAuthentication(options =>
{
options.ProviderOptions.DefaultAccessTokenScopes.Add("https://graph.microsoft.com/User.Read");
}
Это была странная ошибка, никогда не ожидал и не видел ее.
Ссылка на AuthenticationService. js в индексе. html не было верный. Я исправил это так, чтобы оно было ...
<script src="_content/Microsoft.Authentication.WebAssembly.Msal/AuthenticationService.js"></script>
Я также загрузил последний код сюда
Метод IAccessTokenProvider.RequestToken
обеспечивает перегрузку, которая позволяет приложению для предоставления токена доступа с заданным набором областей.
В компоненте Razor вы можете написать что-то вроде ниже:
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject IAccessTokenProvider TokenProvider
...
var tokenResult = await TokenProvider.RequestAccessToken(
new AccessTokenRequestOptions
{
Scopes = new[] { "https://graph.microsoft.com/Mail.Send",
"https://graph.microsoft.com/User.Read" }
});
if (tokenResult.TryGetToken(out var token))
{
...
}
AccessTokenResult.TryGetToken
возвращает:
true
с токеном для использования. false
, если токен не получен.
Надеюсь, это вам поможет.