Azure Function v3 - 在启动中添加标识时“无法访问 Azure Functions 运行时”

Posted

技术标签:

【中文标题】Azure Function v3 - 在启动中添加标识时“无法访问 Azure Functions 运行时”【英文标题】:Azure Function v3 - "Azure Functions runtime is unreachable" when add Identity in Startup 【发布时间】:2021-09-03 01:18:58 【问题描述】:

我有一个Azure Function (v3),它必须与数据库以及用户管理进行交互。 它具有一个依赖项,该项目还包含 DAL 以及所有上下文配置。 在函数的启动中,我将依赖项添加到 DbContext 并将其部署在 Azure 上,我没有问题。 除了DbContext,我还添加Identity 并重新部署时,门户网站显示“Azure Functions 运行时无法访问”。

这是Startup.cs的函数:

[assembly: FunctionsStartup(typeof(Directio.PeopleSee.OrderSynchronizer.Startup))]

namespace Directio.PeopleSee.OrderSynchronizer

    public class Startup : FunctionsStartup
    
        public override void Configure(IFunctionsHostBuilder builder)
        
            builder.Services.AddHttpClient();

            builder.Services.AddDbContext<DBContext>(options1 =>
            
                options1.UseLazyLoadingProxies(false);
                options1.UseSqlServer(Environment.GetEnvironmentVariable("DBConnectionString"), builder =>
                
                    builder.CommandTimeout(10);
                
                );
            )
            .AddIdentity<AspNetUser, AspNetRole>(opt =>
             
                 opt.Password.RequireDigit = false;
                 opt.Password.RequireLowercase = false;
                 opt.Password.RequireNonAlphanumeric = false;
                 opt.Password.RequireUppercase = false;
                 opt.Password.RequiredLength = 0;
                 opt.Password.RequiredUniqueChars = 0;
                 opt.User.RequireUniqueEmail = false;
                 opt.SignIn.RequireConfirmedEmail = false;
                 opt.SignIn.RequireConfirmedAccount = false;
                 opt.SignIn.RequireConfirmedPhoneNumber = false;
             )
            .AddEntityFrameworkStores<DBContext>()
            .AddDefaultTokenProviders();

            builder.Services.AddOptions<FunctionAppSettings>().Configure<IConfiguration>((settings, configuration) => configuration.GetSection("FunctionAppSettings").Bind(settings));

            builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
            builder.Services.AddScoped<IUserService, UserServiceImpl>();
            builder.Services.AddScoped<IRoleService, RoleServiceImpl>();
            builder.Services.AddScoped<ISubscribersService, SubscriberServiceImpl>();
            builder.Services.AddScoped<IOrdersService, OrdersService>();
        
    

所有服务注册都来自依赖项所链接的项目。 该函数以netcore3.1为框架,部署在Azure Func App中,按量付费,Windows服务器,不是docker容器。

可能是什么问题?

【问题讨论】:

你有解决办法吗? @Sachin 我“解决了”它在启动时只添加没有身份的 EF 并使用 IdentityFrameworkDBContext 类方法处理用户。您必须遵循一些规则才能正确填写您的 IdentityUser 属性。这里有一些例子:codeshare.io/9OjEE4 非常感谢..我也在尝试类似的方法,所以现在有信心可以实现:)再次感谢.. 我想分享另一个提示,即使它与您的具体问题无关。由于这是当您搜索“Azure Functions 运行时无法访问”时 SO 上的第一个结果,它可能对其他人有所帮助:确保您的函数名称(即通过 FunctionName Annotation)中没有任何空格。 【参考方案1】:

当您添加身份时,您还添加了 AspNetCore 身份验证依赖项。出于某种原因,Functions host 检查您的应用程序中是否存在这些依赖项,并阻止 Host 模块添加允许门户访问项目中的功能的内置身份验证方案。

如果您仍想在启动时加载身份组件,我建议您查看https://www.nuget.org/packages/DarkLoop.Azure.Functions.Authorize

这是一篇描述其工作原理的帖子:https://blog.darkloop.com/post/functionauthorize-for-azure-functions-v3

你可以打电话

builder.AddAuthentication();
builder.AddAuthorization();
// or
builder.Services.AddFunctionsAuthentication();
builder.Services.AddFunctionsAuthorization();

此调用强制加载内置身份验证功能,并允许您添加更多身份验证依赖项和方案。

通话结束后,您可以拨打电话AddDbContext&lt;...AddIdentity&lt;...

Azure 门户应该能够获得它需要的关于你的函数的所有信息。

【讨论】:

以上是关于Azure Function v3 - 在启动中添加标识时“无法访问 Azure Functions 运行时”的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地环境中自动启动 Azure Function?

如何在启动类中使用 Azure Function 中的中间件

未调用 Azure Function 启动的配置

如何创建基于 Youtube API 上传视频代码的 Azure Function?

如何知道 Azure Function 已重启?

appsettings.json 值在 Azure Functions App V3 中未绑定