api - 与 MS Graph 和 asp.net Core API 斗争
问题描述
我正在努力使用带有 .NET Core API 的 Microsof Graph 从 Azure AD 获取用户信息。我尝试了几个教程,但我遇到了几个问题。
用于 ASP.NET Core 3.1 的 Microsoft Graph Connect 示例 https://docs.microsoft.com/en-us/samples/microsoftgraph/aspnetcore-connect-sample/microsoft-graph-connect-sample-for-aspnet-core-31/ )
本教程看起来很有希望,但事实证明它需要一个多租户 Azure 应用程序 - 但我的是单租户。
从 ASP.NET Core 3.1 ( https://github.com/cmatskas/aspnetcorewithgraph/blob/master/WebApplication1/Startup.cs )调用 MS Graph API
本教程看起来很有趣,但它在预览模式下使用了两个 NuGet 包。当我尝试代码时(请参阅我的 startup.cs),它会抛出问题
“元数据地址或授权必须使用 HTTPS,除非通过设置 RequireHttpsMetadata=false 禁用开发。”
我尝试在我的 addJwTBearer 选项中将其设置为 false,但问题仍然存在。
你们有没有机会知道我的案例的好教程,或者我的启动文件有什么问题?
启动.cs
public void ConfigureServices(IServiceCollection services)
{
// APISettings
services.Configure<APISettings>(Configuration.GetSection("APISettings"));
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
// Add our Config object so it can be injected
//services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
AppConstants.AppUserRoles = new AppUserRoles();
AppConstants.AppUserRoles.AdminDatabaseID = Configuration.GetSection("AppSettings").GetSection("AppUserRoles").GetValue<int>("AdministratorDatabaseID");
AppConstants.AppUserRoles.UserDatabaseID = Configuration.GetSection("AppSettings").GetSection("AppUserRoles").GetValue<int>("UserDatabaseID");
AppConstants.AppUserRoles.ManagerDatabaseID = Configuration.GetSection("AppSettings").GetSection("AppUserRoles").GetValue<int>("ManagerDatabaseID");
// Repositories
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<ITimeLogRepository, TimeLogRepository>();
services.AddTransient<IReportRepository, ReportRepository>();
services.AddTransient<ICalendarRepository, CalendarRepository>();
// Models
services.AddTransient<CreateTimeLogResponse>();
// Services
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IDatabase, Database>();
services.AddTransient<ISessionService, SessionService>();
services.AddTransient<IIdentityClaimService, IdentityClaimService>();
services.AddTransient<IUserService, UserService>();
services.AddTransient<TimeLogService>();
services.AddTransient<ReportsService>();
services.AddTransient<ICalendarService, CalendarService>();
// AutoMapper
services.AddAutoMapper(typeof(Startup));
// Were only using API.
services
.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
// Azure AD Authentication
services
.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
var authSettings = Configuration.GetSection("AzureAd").Get<AzureAdOptions>();
options.Audience = authSettings.ClientId;
options.Authority = authSettings.Authority;
options.RequireHttpsMetadata = false;
});
// MS Graph.
services.AddSignIn(Configuration);
services.AddWebAppCallsProtectedWebApi(Configuration, new string[] { "user.read" })
.AddInMemoryTokenCaches(); // Or .AddDistributedTokenCaches(); depending on which token cache provider from Microsoft.Identity.Web you would like to use.
services.AddGraphService(Configuration);
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/build";
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromMinutes(1);
options.Cookie.HttpOnly = true;
// Make the session cookie essential
options.Cookie.IsEssential = true;
});
}
解决方案
适用于 ASP.NET Core 3.1 的 Microsoft Graph Connect 示例应与单租户应用程序一起使用。
将 GraphAuthProvider.cs第 28 行更新为:
.WithAuthority(AzureCloudInstance.AzurePublic, AadAuthorityAudience.AzureAdMyOrg)
推荐阅读
- java - 为什么在低通滤波器循环中出现 IndexOutOfBoundsException 错误?
- git - git add 删除 readme.md 文件中的所有空格
- sql - 如何选择没有特定重复列的行
- python - 从字符串Python中提取值
- javascript - javascript递归函数不会停止执行
- json - 粘贴特殊(json 到类)缺少 VS2019 - 安装了所有 Web 开发工具
- java - 如何计算世界空间中的相机向上矢量
- node.js - 未找到 ReactJS
- c# - 如何使用 ASP.NET MVC 将图像名称上传到数据库?
- ruby-on-rails - 未初始化的常量设计(NameError)独角兽