首页 > 解决方案 > 在 Asp.NET Core Azure AD 身份验证中配置重定向 URI

问题描述

如何告诉我的应用使用我提供的主机生成重定向 URI?( foobar.com)

语境:

我有从最近的(VS 16.7.5)模板生成的服务器端 Blazor Web 应用程序,具有 Azure AD(单租户、工作和学校)身份验证。

我用 <PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.8" />

我已经在 Az Portal 等处配置了接受的重定向 URL,并且可以在本地运行我的应用程序时使用 Azure AD 登录。

流动

重定向 URI 在被重定向到 Azure AD 站点时在查询参数中发送,它指向实际是的网站主机foobar.azurewebsites.net

如何告诉我的应用使用我提供的主机生成重定向 URI?( foobar.com)

我发现的唯一解决方案与以前的 ASP.NET 有关。

<add key="ida:RedirectUri" value="https://localhost:44326/" />

在我的情况下,这不起作用。

标签: .netasp.net-coreazure-active-directoryblazor

解决方案


作为一种解决方法,我添加了一个中间件,用于替换redirect_uri发送到 Azure AD 的回调 URL 中的参数。

public class ResponseInspectMiddleware
{
    private readonly RequestDelegate _next;
    private readonly AzureADSettings _azureAdSettings;

    public ResponseInspectMiddleware(RequestDelegate next, AzureADSettings azureAdSettings)
    {
        _next = next;
        _azureAdSettings = azureAdSettings;
    }

    public async Task Invoke(HttpContext context)
    {
        await _next(context);

        var headers = context.Response.Headers;
        const string LOCATION_HEADER = "location", REDIRECT_URI_PARAM = "redirect_uri";

        if (context.Response.StatusCode == 302
            && headers.ContainsKey(LOCATION_HEADER)
            && Uri.TryCreate(headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out var locationHeader))
        {
            Url locationUrl = locationHeader;

            if (locationUrl.ToString().StartsWith(_azureAdSettings.Instance)
                && locationUrl.QueryParams.ContainsKey(REDIRECT_URI_PARAM))
            {
                // Update redirect_url query param

                // Make new redirect url
                var callbackHost = _azureAdSettings?.CallbackHost ?? throw new ArgumentNullException($"{_azureAdSettings.CallbackHost} is not set.");
                var callbackPath = _azureAdSettings?.CallbackPath ?? throw new ArgumentNullException($"{_azureAdSettings.CallbackPath} is not set.");
                Url newRedirectUrl = callbackHost + callbackPath;

                locationUrl.SetQueryParam(REDIRECT_URI_PARAM, newRedirectUrl, isEncoded: false);

                // Swap location headers
                headers.Remove(LOCATION_HEADER);
                headers.Add(LOCATION_HEADER, new StringValues(locationUrl.ToString()));
            }
        }
    }
}

推荐阅读