首页 > 解决方案 > 与 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;
        });
    }

标签: api.net-coremicrosoft-graph-api

解决方案


适用于 ASP.NET Core 3.1 的 Microsoft Graph Connect 示例应与单租户应用程序一起使用。

将 GraphAuthProvider.cs第 28 行更新为:

    .WithAuthority(AzureCloudInstance.AzurePublic, AadAuthorityAudience.AzureAdMyOrg)

推荐阅读