.net - 在 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/" />
在我的情况下,这不起作用。
解决方案
作为一种解决方法,我添加了一个中间件,用于替换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()));
}
}
}
}
推荐阅读
- azure - Azure Monitor 警报跨资源日志搜索错误
- java - 套接字返回双输入
- python - 如何从 setup.py 添加 cron 作业
- nock - 对多个测试的相同 URL 使用 Nock 失败
- vba - Access 2016 在 SQL 查询中使用组合框
- angular - ag-grid 标题复选框选择事件
- html - 使视频的宽度和高度与它所在的 div 相同
- dart - 如何在 Flutter 中创建带有底部彩色边框的 AppBar?
- javascript - 如何通过量角器在Firefox中处理下载文件保存对话框
- php - SoapClient:无法连接到主机