Skip to content

Commit e79d04a

Browse files
committed
Implement connection to Azure Storage Queue using Active Directory.
1 parent 8c9584e commit e79d04a

File tree

5 files changed

+85
-34
lines changed

5 files changed

+85
-34
lines changed

dotnet/src/dotnetcore/Providers/Messaging/GXAzureQueue/AzureMessageQueueProvider.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,35 @@
33

44
namespace GeneXus.Messaging.Queue
55
{
6+
/// <summary>
7+
/// Implementation of AzureQueue.MessageQueueProvider external object.
8+
/// </summary>
9+
///
610
public class AzureMessageQueueProvider
711
{
8-
private const string AZUREQUEUE = "AZUREQUEUE";
9-
public SimpleMessageQueue Connect(string queueName, string queueURL, out GXBaseCollection<SdtMessages_Message> errorMessages, out bool success)
12+
public SimpleMessageQueue Connect(string queueName, string connectionString, out GXBaseCollection<SdtMessages_Message> errorMessages, out bool success)
1013
{
1114
MessageQueueProvider messageQueueProvider = new MessageQueueProvider();
12-
GXProperties properties = new GXProperties();
13-
properties.Add("QUEUE_AZUREQUEUE_QUEUENAME", queueName);
14-
properties.Add("QUEUE_AZUREQUEUE_CONNECTIONSTRING", queueURL);
15-
SimpleMessageQueue simpleMessageQueue = messageQueueProvider.Connect(AZUREQUEUE, properties, out GXBaseCollection<SdtMessages_Message> errorMessagesConnect, out bool successConnect);
15+
GXProperties properties = new GXProperties
16+
{
17+
{ PropertyConstants.QUEUE_AZUREQUEUE_QUEUENAME, queueName },
18+
{ PropertyConstants.QUEUE_AZUREQUEUE_CONNECTIONSTRING, connectionString },
19+
{ PropertyConstants.AUTHENTICATION_METHOD, AuthenticationMethod.Password.ToString()}
20+
};
21+
SimpleMessageQueue simpleMessageQueue = messageQueueProvider.Connect(PropertyConstants.AZURE_QUEUE_PROVIDERTYPENAME, properties, out GXBaseCollection<SdtMessages_Message> errorMessagesConnect, out bool successConnect);
22+
errorMessages = errorMessagesConnect;
23+
success = successConnect;
24+
return simpleMessageQueue;
25+
}
26+
public SimpleMessageQueue Authenticate(string queueURI, out GXBaseCollection<SdtMessages_Message> errorMessages, out bool success)
27+
{
28+
MessageQueueProvider messageQueueProvider = new MessageQueueProvider();
29+
GXProperties properties = new GXProperties
30+
{
31+
{ PropertyConstants.QUEUE_AZUREQUEUE_QUEUEURI, queueURI },
32+
{ PropertyConstants.AUTHENTICATION_METHOD, AuthenticationMethod.ActiveDirectory.ToString()}
33+
};
34+
SimpleMessageQueue simpleMessageQueue = messageQueueProvider.Connect(PropertyConstants.AZURE_QUEUE_PROVIDERTYPENAME, properties, out GXBaseCollection<SdtMessages_Message> errorMessagesConnect, out bool successConnect);
1635
errorMessages = errorMessagesConnect;
1736
success = successConnect;
1837
return simpleMessageQueue;

dotnet/src/dotnetcore/Providers/Messaging/GXAzureQueue/AzureQueue.cs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Reflection;
4+
using Azure.Identity;
45
using Azure.Storage.Queues;
56
using Azure.Storage.Queues.Models;
67
using GeneXus.Messaging.Common;
78
using GeneXus.Services;
89
using GeneXus.Utils;
10+
using log4net;
911

1012
namespace GeneXus.Messaging.Queue
1113
{
1214
public class AzureQueue : QueueBase, IQueue
1315
{
16+
public static string Name = "AZUREQUEUE";
1417

15-
public static String Name = "AZUREQUEUE";
16-
const string QUEUE_NAME = "QUEUENAME";
17-
const string QUEUE_CONNECTION_STRING = "CONNECTIONSTRING";
18-
18+
static readonly ILog logger = LogManager.GetLogger(typeof(AzureQueue));
1919
QueueClient _queueClient { get; set; }
2020
private string _queueName { get; set; }
2121
private string _connectionString { get; set; }
22+
private string _queueURI { get; set; }
2223

2324
public AzureQueue() : this(null)
24-
{
25-
}
25+
{}
2626

2727
public AzureQueue(GXService providerService) : base(providerService)
2828
{
@@ -31,16 +31,27 @@ public AzureQueue(GXService providerService) : base(providerService)
3131

3232
private void Initialize(GXService providerService)
3333
{
34-
ServiceSettings serviceSettings = new("QUEUE", Name, providerService);
35-
_queueName = serviceSettings.GetEncryptedPropertyValue(QUEUE_NAME);
36-
_connectionString = serviceSettings.GetEncryptedPropertyValue(QUEUE_CONNECTION_STRING);
34+
ServiceSettings serviceSettings = new(PropertyConstants.QUEUE_SERVICE_NAME, Name, providerService);
35+
_queueName = serviceSettings.GetEncryptedPropertyValue(PropertyConstants.QUEUENAME);
36+
_connectionString = serviceSettings.GetEncryptedPropertyValue(PropertyConstants.CONNECTIONSTRING);
37+
_queueURI = serviceSettings.GetEncryptedPropertyValue(PropertyConstants.QUEUEURI);
38+
string authenticationMethod = serviceSettings.GetPropertiesValue(PropertyConstants.AUTHENTICATION_METHOD);
3739

3840
QueueClientOptions queueClientOptions = new QueueClientOptions()
3941
{
4042
MessageEncoding = QueueMessageEncoding.Base64
4143
};
4244

43-
_queueClient = new QueueClient(_connectionString, _queueName, queueClientOptions);
45+
if (authenticationMethod.Equals(AuthenticationMethod.ActiveDirectory.ToString()))
46+
{
47+
_queueClient = new QueueClient(new Uri(_queueURI), new DefaultAzureCredential(),queueClientOptions);
48+
GXLogging.Debug(logger, "Authenticate to Azure Storage Queue using Active Directory authentication.");
49+
}
50+
else
51+
{
52+
_queueClient = new QueueClient(_connectionString, _queueName, queueClientOptions);
53+
GXLogging.Debug(logger, "Authenticate to Azure Storage Queue using Access Keys.");
54+
}
4455
}
4556

4657
QueueClient QueueClient
@@ -59,11 +70,6 @@ public AzureQueue(string connectionString, string queueName)
5970
_connectionString = connectionString;
6071
}
6172

62-
//public AzureQueue(Uri uri, TokenCredential tokenCredential)
63-
//{
64-
//_queueClient = new QueueClient(uri, tokenCredential);
65-
//}
66-
6773
public bool GetMessageFromException(Exception ex, SdtMessages_Message msg)
6874
{
6975
try

dotnet/src/dotnetcore/Providers/Messaging/GXAzureQueue/GXAzureQueue.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="Azure.Identity" Version="1.9.0" />
1011
<PackageReference Include="Azure.Storage.Queues" Version="12.15.0" />
1112
</ItemGroup>
1213

dotnet/src/dotnetcore/Providers/Messaging/GXQueue/MessageQueueProvider.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@ namespace GeneXus.Messaging.Common
1111
[GXApi]
1212
public class MessageQueueProvider : SimpleMessageQueue
1313
{
14-
static readonly ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
14+
static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
1515
private static GXService providerService;
16-
public MessageQueueProvider()
17-
{
18-
16+
public MessageQueueProvider(){
1917
}
2018

2119
public SimpleMessageQueue Connect(string providerTypeName, GXProperties properties, out GXBaseCollection<SdtMessages_Message> errorMessages, out bool success)
@@ -69,19 +67,19 @@ public SimpleMessageQueue Connect(string providerTypeName, GXProperties properti
6967
return (simpleMessageQueue);
7068
}
7169

72-
private static void Preprocess(String name, GXProperties properties)
70+
private static void Preprocess(string name, GXProperties properties)
7371
{
7472
string className;
75-
7673
switch (name)
7774
{
7875
case "AZUREQUEUE":
79-
className = "GeneXus.Messaging.Queue.AzureQueue";
80-
SetEncryptedProperty(properties, "QUEUE_AZUREQUEUE_QUEUENAME");
81-
SetEncryptedProperty(properties, "QUEUE_AZUREQUEUE_CONNECTIONSTRING");
76+
className = PropertyConstants.AZURE_QUEUE_CLASSNAME;
77+
SetEncryptedProperty(properties, PropertyConstants.QUEUENAME);
78+
SetEncryptedProperty(properties, PropertyConstants.CONNECTIONSTRING);
79+
SetEncryptedProperty(properties, PropertyConstants.QUEUEURI);
8280
if (string.IsNullOrEmpty(providerService.ClassName) || !providerService.ClassName.Contains(className))
8381
{
84-
providerService.ClassName = "GeneXus.Messaging.Queue.AzureQueue, GXAzureQueue, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
82+
providerService.ClassName = PropertyConstants.AZURE_QUEUE_PROVIDER_CLASSNAME;
8583
}
8684
break;
8785
case "AWS_SQS":
@@ -100,11 +98,11 @@ private static void Preprocess(String name, GXProperties properties)
10098
throw new SystemException(string.Format("Provider {0} is not supported.", name));
10199
}
102100
}
103-
private static void SetEncryptedProperty(GXProperties properties, String prop)
101+
private static void SetEncryptedProperty(GXProperties properties, string prop)
104102
{
105-
String value = properties.Get(prop);
103+
string value = properties.Get(prop);
106104
if (string.IsNullOrEmpty(value))
107-
value = String.Empty;
105+
value = string.Empty;
108106
value = CryptoImpl.Encrypt(value);
109107
properties.Set(prop, value);
110108
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace GeneXus.Messaging.Common
2+
{
3+
public static class PropertyConstants
4+
{
5+
//Azure Storage Queue
6+
internal const string AZURE_QUEUE_CLASSNAME = "GeneXus.Messaging.Queue.AzureQueue";
7+
internal const string AZURE_QUEUE_PROVIDER_CLASSNAME = "GeneXus.Messaging.Queue.AzureQueue, GXAzureQueue, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
8+
public const string AZURE_QUEUE_PROVIDERTYPENAME = "AZUREQUEUE";
9+
10+
public const string QUEUE_SERVICE_NAME = "QUEUE";
11+
12+
public const string QUEUE_AZUREQUEUE_QUEUENAME = "QUEUE_AZUREQUEUE_QUEUENAME";
13+
public const string QUEUE_AZUREQUEUE_CONNECTIONSTRING = "QUEUE_AZUREQUEUE_CONNECTIONSTRING";
14+
public const string QUEUE_AZUREQUEUE_QUEUEURI = "QUEUE_AZUREQUEUE_QUEUEURI";
15+
16+
public const string QUEUENAME = "QUEUENAME";
17+
public const string CONNECTIONSTRING = "CONNECTIONSTRING";
18+
public const string QUEUEURI = "QUEUEURI";
19+
public const string AUTHENTICATION_METHOD = "AUTHENTICATION_METHOD";
20+
21+
}
22+
public enum AuthenticationMethod
23+
{
24+
ActiveDirectory,
25+
Password
26+
}
27+
}

0 commit comments

Comments
 (0)