我试图同时处理两件事,但我运气不好。
在我的.Net 6 Blazor WebAssembly Hosted中,我可以登录Azure AD帐户,它可以按照示例正常工作:https://learn.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/hosted-with-azure-active-directory?view=aspnetcore-6.0
此外,我可以按照以下方式登录到Microsoft Graph:https://github.com/microsoftgraph/msgraph-training-blazor-clientside
但我想要的是能够拥有一个对两者都有效的代币。我想调用MicrosoftGraph并从服务器端调用我的API。
任何如何混合两者的想法";样品";让它发挥作用?我想我唯一需要的就是";混合";在程序中.cs这个:
builder.Services.AddHttpClient("ReservasSalasAuth.ServerAPI", client =>
client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("ReservasSalasAuth.ServerAPI"));
这个:
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("https://graph.microsoft.com") });
但我没有运气。。。
经过进一步调查。。。我意识到AddMsalAuthentication中的顺序会有所不同。。。
builder.Services.AddMsalAuthentication<RemoteAuthenticationState, CustomUserAccount>(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
var ApiScope = builder.Configuration.GetValue<string>("ApiScope");
options.ProviderOptions.DefaultAccessTokenScopes.Add(ApiScope);
options.UserOptions.RoleClaim = "appRole";
var scopes = builder.Configuration.GetValue<string>("GraphScopes");
foreach (var scope in scopes.Split(';'))
{
options.ProviderOptions.DefaultAccessTokenScopes.Add(scope);
}
}).AddAccountClaimsPrincipalFactory<RemoteAuthenticationState, CustomUserAccount, GraphUserAccountFactory>();
通过这种方式,我为Api取了Scope,它可以进行Api调用,但不能进行Graph调用。
builder.Services.AddMsalAuthentication<RemoteAuthenticationState, CustomUserAccount>(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.UserOptions.RoleClaim = "appRole";
var scopes = builder.Configuration.GetValue<string>("GraphScopes");
foreach (var scope in scopes.Split(';'))
{
options.ProviderOptions.DefaultAccessTokenScopes.Add(scope);
}
var ApiScope = builder.Configuration.GetValue<string>("ApiScope");
options.ProviderOptions.DefaultAccessTokenScopes.Add(ApiScope);
}).AddAccountClaimsPrincipalFactory<RemoteAuthenticationState, CustomUserAccount, GraphUserAccountFactory>();
改变我放置范围的顺序,它可以使用Graph调用,但不能使用API调用。
有什么想法可以让它同时起作用吗?
我也遇到了同样的问题。你不能用Msal来操作两个不同的权限。因此,如果你想同时使用graph和api,你需要选择一个与Msal一起使用,而对于另一个,你需要自己制定整个需求。因此,请求授权代码,使用它来获得新的访问令牌,然后将这个新令牌作为头中的承载用于您的第二个Http客户端。
所以,是的,你不能只通过一次登录就达到你想要的目的。
看看吴最后的评论https://stackoverflow.com/a/65694725