// This example shows how to create and use custom security roles in OPC UA servers.
// You can use any OPC UA client, including our Connectivity Explorer and OpcCmd utility, to connect to the server.
//
// Find all latest examples here: https://www.doc-that.com/files/onlinedocs/OPCLabs-ConnectivityStudio/Latest/examples.html .
// OPC client, server and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-ConnectivityStudio-CSharp .
// Missing some example? Ask us for it on our Online Forums, https://forum.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
using OpcLabs.BaseLib.Security.User.Extensions;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.NodeSpace;
using OpcLabs.EasyOpc.UA.Security.Subject;
using System;
namespace UAServerDocExamples.AccessControl
{
internal class _UASecurityRoles
{
public static void Create()
{
// Instantiate the server object.
// By default, the server will run on endpoint URL "opc.tcp://localhost:48040/".
var server = new EasyUAServer();
// Create a custom security role with specified Node Id and name.
UASecurityRole mySecurityRole = UASecurityRoles.Create(
"nsu=http://my.example;s=MySecurityRole", "MySecurityRole");
// Create users. Only the user "charlie" will be assigned the custom security role created above.
server.UserManagers.NameAndPassword.CreateWithSecurityRoleIds("alpha", "pass",
new string [] {UASecurityRoles.Engineer, UASecurityRoles.Operator});
server.UserManagers.NameAndPassword.CreateWithSecurityRoleIds("charlie", "pass",
new string[] { mySecurityRole });
// Create a data variable providing random integers.
var random = new Random();
var dataVariable = new UADataVariable("MyDataVariable").ReadValueFunction(() => random.Next());
// Assign permissions to the data variable. In this case, only users with our custom security role will be able
// to browse, read and write the variable.
dataVariable.PermissionAssignment = new UAPermissionAssignment
{
new UARolePermissions(mySecurityRole, UAPermissions.ViewBasic | UAPermissions.ModifyBasic)
};
// We do not want to inherit permissions from the parent nodes, as they include viewing for TrustedApplication.
dataVariable.PermissionsInheritanceType = UAPermissionsInheritanceType.None;
// Add the data variable to the server's address space.
server.Add(dataVariable);
// Start the server.
Console.WriteLine("The server is starting...");
server.Start();
Console.WriteLine("The server is started.");
Console.WriteLine();
// Let the user decide when to stop.
Console.WriteLine("Press Enter to stop the server...");
Console.ReadLine();
// Stop the server.
Console.WriteLine("The server is stopping...");
server.Stop();
Console.WriteLine("The server is stopped.");
}
}
}