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 运行时”的主要内容,如果未能解决你的问题,请参考以下文章