我们将一个应用程序部署为应用程序服务,并使用 SignalR 进行通信。启用 AAD 身份验证后 - 在浏览器中,我们开始收到 302 响应,并将位置重定向到 Azure AD。
似乎应用服务上的身份验证层忽略了查询字符串传递的access_token
。
请求
Request URL: wss://<url>/hubs/chat?access_token=<token>
Request Method: GET
回应
Status Code: 302 Redirect
Location: https://login.windows.net/common/oauth2/authorize?...
到处寻找后,我们找不到任何解决方案来完成这项工作。 我们看到的此问题的唯一解决方案是禁用应用服务上的身份验证或使用长池,但这两个选项在我们的情况下都是 Not Acceptable 。
最佳答案
默认情况下,您的 Web 应用程序不会从查询字符串中获取访问 token 。通常,它会从授权 header 或 cookie 中获取访问 token 。
要从查询字符串获取访问 token ,您需要实现自定义身份验证方式。
- 安装 Microsoft.Owin.Security.ActiveDirectory NuGet 软件包。
- 创建一个将从查询字符串获取访问 token 的身份验证提供程序。
public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
public override Task RequestToken(OAuthRequestTokenContext context)
{
var value = context.Request.Query.Get("access_token");
if (!string.IsNullOrEmpty(value))
{
context.Token = value;
}
return Task.FromResult<object>(null);
}
}
- 在 中添加 map 。
app.Map("/yourpath", map =>
{
map.UseWindowsAzureActiveDirectoryBearerAuthentication(new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Provider = new QueryStringOAuthBearerProvider(),
Tenant = tenantId,
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = clientId
}
});
map.RunSignalR(hubConfiguration);
});
关于具有 Websocket 和 AD 身份验证的 Azure 应用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56837316/