将OpenIdConnect与AzureFunctions一起使用

时间:2019-08-08 03:51:48

标签: azure-functions openid-connect

我正在使用azure函数来托管react应用程序的API,但是我也在使用相同的azure函数来托管应用程序的html / js / css(通过代理函数访问Blob存储上的静态文件)

我一直在使用EasyAuth为它提供身份验证,该方法一直运行出色,但是我需要支持EasyAuth内置的身份提供程序(它根本不支持自定义身份提供程序)。这意味着我要回到使用Microsoft.AspNetCore.Authentication.OpenIdConnect程序包。

我已经在启动文件中注册了身份验证

    [FunctionName("CustomAuth")]
    public async Task<IActionResult?> Challenge([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = ".auth/login/custom")]HttpRequest req, ILogger log)
    {
        return new ChallengeResult("custom");
    }

还有一个让我触发挑战的功能

{{1}}

如果我按下此功能,则效果很好,可以重定向到auth提供程序进行登录。

但是,一旦我登录,它就会重定向回我的404应用程序

http://localhost:7071/signin-oidc?querystringhere

在这个阶段,我猜测AddAuthentication不能像在asp.net mvc内核中使用它时那样,可以挂接到传入的Web请求中。想知道我是否可以通过较低级别或通过自定义的Azure函数将其连接起来

1 个答案:

答案 0 :(得分:3)

  • 添加对Microsoft.Azure.WebJobs.Script.WebHost的引用
  • 使用相对较新的IJobHostHttpMiddleware接口创建AzureFunctions中间件
  • 将此中间件注册为服务
    
    public class AzureFunctionsAuthenticationMiddleware : IJobHostHttpMiddleware
    {
        private IAuthenticationSchemeProvider _schemeProvider;

        public AzureFunctionsAuthenticationMiddleware(IAuthenticationSchemeProvider schemeProvider)
        {
            _schemeProvider = schemeProvider;
        }

        public Task Invoke(HttpContext context, RequestDelegate next)
        {
            return new AuthenticationMiddleware(next, _schemeProvider).Invoke(context);
        }
    }

  public void Configure(IWebJobsBuilder builder)
        {
            builder.Services.AddHttpContextAccessor();


            builder.Services.AddSingleton();

            builder.Services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddArmToken()
            .AddScriptAuthLevel()
            .AddScriptJwtBearer()
            .AddCookie()
            .AddOpenIdConnect("custom", o =>
            {
                o.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
                o.SignInScheme = "Cookies";

                o.MetadataAddress = "metadata address";
                o.ClientId = "clientid";
                o.ClientSecret = "secret";
                o.ResponseMode = "query";
                o.ResponseType = "code";
            });

这解决了signin-oidc 404问题,我现在遇到另一个不确定的无效openid消息问题,我不确定该消息是否相关(例如,我认为我的openidconnect服务器不正确,而不是我的客户端不正确)