Yav*_*vuz 4 authentication azure signalr azure-functions
我正在编写一个类似Web应用程序的仪表板.外部系统的状态变化应通过SignalR下推到浏览器.外部系统将其更新发送到Azure Service Bus主题.我编写了一个Azure功能,它将由其中一个主题触发.该功能通过SignalR .Net客户端库连接到SignalR集线器,并将消息转发到集线器.然后,集线器将消息发送到浏览器.
现在这很好用.下一步是启用SignalR集线器的身份验证.Web应用程序的其他部分需要身份验证.用户使用其Azure AD凭据登录.
问题是Azure功能如何针对SignalR进行身份验证?在Azure功能应用程序的应用程序设置中保存一些凭据是不行的.
我已经研究了SignalR的扩展技术的解决方法.我们可以将服务总线主题配置为背板.每个SignalR集线器都会将消息的副本发送到主题中,以便集线器的其他实例获取消息并将其下推到其连接的客户端.想法是Azure功能将状态信息推送到背板主题.但遗憾的是SignalR使用未知编码.所以这种解决方法是不可能的.
详细了解@ astaykov的回答
在SignalR的应用注册中添加应用角色.
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Access SignalR Backend",
"id": "239de039-e2c5-445c-8454-ccdc51888b94",
"isEnabled": true,
"description": "Allow the application to access SignalR Backend.",
"value": "access"
}
],
Run Code Online (Sandbox Code Playgroud)在Azure Function App的应用程序注册中创建密钥,并在获取令牌时使用它.
var ctx = new AuthenticationContext(tenant);
var cred = new ClientCredential(functionAppRegistrationId, key);
AuthenticationResult result = await ctx.AcquireTokenAsync(signalRRegistrationId, cred);
Run Code Online (Sandbox Code Playgroud)你提出两个问题.所以我会单独发痒.
问题是Azure功能如何针对SignalR进行身份验证?在Azure功能应用程序的应用程序设置中保存一些凭据是不行的.
正如@GreameMiller已经提到的那样,你应该看看使用OAuth Bearer Token验证SignalR.对于功能应用程序,您可以在Azure AD中创建服务主体,并使用它来获取SignalR的有效令牌(无论如何,它必须是Azure AD中的另一个应用程序,或者与您的Web应用程序相同).后者你可能已经完成了,你需要得到前者.
一个非常重要的事情 - 一旦您在Azure AD中同时获得"应用程序"(服务主体),您必须确保"功能应用程序服务主体"可以通过明确授予"SignalR Web App"来访问"SignalR Web App". Azure AD门户.再次从该文章中,您必须转到"功能应用程序"应用程序的配置设置,并确保配置"对其他应用程序的权限".如果您已正确配置WebApp(使用SignalR),您将在可用的配置应用程序列表中看到该选项,只有选项 - 应用程序的访问名称.你必须使用Application Permissions而不是 Delegated Permissions.
其余的工作是标准的OAuth2客户端编程 - 客户端ID +客户端密钥.但是,是的,您必须将这些保留在功能应用程序的功能中.不确定您如何想象功能应用程序可以获得没有任何凭据的令牌.
你的第二部分
...想法是Azure功能将状态信息推送到背板主题.但遗憾的是SignalR使用未知编码.所以这种解决方法是不可能的.
使用ServiceBus作为signalR的背板,您正走在正确的道路上.但是,这是设计用于帮助在横向扩展部署(通常是云的所有内容)上同步所有signalR集线器,而不是让客户将消息推送到集线器.这些是仅由signalR集线器使用的系统消息,以确保每个人都知道一切.当走向云端并且规模扩大时 - 无论如何你都需要这架背板.
| 归档时间: |
|
| 查看次数: |
1851 次 |
| 最近记录: |