arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 97

Vidyano Documentation

Loading...

Vidyano v6 (.NET 8.0 based)

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Release Notes

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Vidyano.Core

The Vidyano.Core NuGet package is a powerful tool designed for developers who want to connect to their Vidyano applications using C#.

Available on , it offers seamless access for creating custom integrations or performing unit tests, ensuring enhanced functionality and reliability in your applications.

GitHubarrow-up-right

Icons

Ensure you are using version 3.19.0 or later of Web3 to take advantage of the new feature that allows setting any Iconify icon as an icon for a custom action. Access the full list of icons at , and use the set:name format for specifying icons in your custom actions.

In the Management you can go to the Custom Action and enter the set:name of the icon you want to use. For example material-symbols:verified-user-outline for an Check user action.

Iconifyarrow-up-right

Verbose Logs

Vidyano has the ability to enable verbose logging. This will log all requests including details about the user (user name, ip address, user agent, client version, …), the incoming data and outgoing data. This can help for troubleshooting request or for auditing purposes.

hashtag
Custom Vars Example

As a developer you can also set 5 custom variables per request to make it easier to search for specific request or easily see something without having to open the incoming or outgoing data.

// Check the user's language at the moment of the request
Manager.Current.SetLogCustomVar(1, Manager.Current.UserLanguage);
// Check the user's culture info at the moment of the request
Manager.Current.SetLogCustomVar(2, Manager.Current.UserCulture);
// Check the weekday at the moment of the request
Manager.Current.SetLogCustomVar(5, Manager.Current.Today.DayOfWeek.ToString());

hashtag
RequestId Example

On the client side we can also set a request id that can be used as correlation id to follow different request in a single brower session or on a specific computer. You can use the AppServiceHook.createData method to set a requestId on the data.

Grids

circle-info

These screenshots are from older versions, some minor UI changes can be expected

The query grid is a powerful data table component with the following features:

hashtag
Big data

Users can quickly scroll over a million lines of data. While in practice this would make for a time consuming job, other features such as filtering will make it easy to find relevant data. Developers however do not need to worry about the size of the data set as data is loaded and rendered in a performance and memory efficient way.

hashtag
Lazy loading

Data set chunks are loaded whenever they should be visible within the visible boundaries of the screen. This means that even if your entire data set would potentially return over a million records but your screen can only show 30 or so at the time, the grid will load a chunk of data (by default in pages of 100 records).

hashtag
Data sorting

Out of the box sorting of data on any column or multiple columns by holding the CTRL-key and clicking each column in order of sorting priority.

hashtag
Pin columns

Keep columns in view while horizontally scrolling over your data. This view-state is automatically persisted on their profile.

hashtag
Hide columns

Users are in control over the amount of data they want on the screen. This view-state is automatically persisted on their profile.

hashtag
Reorder columns

Users are in control over which columns should be visible first. This view-state is automatically persisted on their profile.

hashtag
Filtering

Easily filter data by clicking on the column filter icon and enter custom filter text or select one or more items from the list with the distinct values for that column in the data set.

Users can choose to save the filter for later use:

hashtag
Built for performance

The grid component uses cutting edge techniques to ensure that the user experience feels lightning fast. For example, the grid reuses DOM elements in order to keep the memory footprint as small as possible while taking advantage of hardware accelerated rendering.

Manage column order, visibility and pinning
Enter search text or select a value from the list
Saved filter that only shows products with color red

Migrating from v5.x

If you still have a Vidyano project running on .NET 4.8 and ASP.NET you can find steps here to migrate to the latest version running on ASP.NET Core.

SourceGenerators

Vidyano makes use of the Vidyano.SourceGenerators NuGet packagearrow-up-right to offer various helpers.

The latest Vidyano project template will enable this by default, otherwise there are a few things that need to be added to the .csproj to provide enough context for it to work.

hashtag
Disclaimer

  • Use of SourceGenerators depend on available content.

  • Analyzers and CodeFixes are available in any project.

Some Patterns are not supported by Analyzers at the moment:

  • When Clause on Switch Expression / Statements

hashtag
Generators

  • Actions Generator

  • BusinessRules Generator

  • Context Generator

  • CustomAction Generator

hashtag
Generated Constant classes

All generated Constant classes are available under {RootNamespace}.Service.Generated namespace.

  • BusinessRuleNames

  • PersistentObjectTypes

  • PersistentObjectAttributeNames

hashtag
Dependency Injection

By using the InitializeByCtor attribute on a field, the source generator will inject this field via the generated constructor.

The Attribute can only be applied when no constructor is provided.

Attribute is available via reference Vidyano.Abstractions.

hashtag
Index Generator

Generate an overview index by adding the GenerateIndex attribute to an entity.

This will result in the following being generated:

  • A partial {Entity} class with a QueryType attribute.

  • A partial {VEntity} QueryType class.

  • A partial {Entities}_Overview

Creating an Index for an Entity

Adding this GenerateIndexattribute creates an overview index.

  • To change the name of the Index, pass the desired type as an argument. Note: Include a namespace if you want the index to be generated under a different namespace.

  • To change the name of the QueryType, use the QueryType attribute.

Important Notes:

  • Index will not be generated if QueryType or Index is already added manually, except if they are partial.

  • If the QueryType contains audit fields, the appropriate interface will be applied. This can differ from the Entity if you add IgnoreForIndex to an audit field.

Additional Attributes

You can add several attributes to the entity's properties to control the index:

  • Search: Adding this attribute creates a second {Property}_Sort property to allow full search on this property.

    Note: This is only needed when values can contain spaces.

  • IgnoreForIndex: This property will not be included in the index.

hashtag
Projects

hashtag
Main project

Additional Files & Global Usings

Add following ItemGroup to the .csproj project file.

External Context

If the context file does not exist in the main project, you can use the appsettings.json file as an alternative, as the context will be read from there.

hashtag
Library project

Missing App_Data json files warning

When incorporating SourceGenerators into a library project, you may encounter a VIDYANO0010 warning indicating missing App_Data JSON files. This warning is not applicable to library projects, as they do not utilize App_Data.

To bypass this warning, two methods are available.

  • By disabling the Model SourceGenerator via local .editorconfig file

  • By ignore the warning via csproj file

hashtag
Exceptions

When using EmitCompilerGeneratedFiles in .csproj project file you can get exceptions when compiling in Windows because of use of long filenames.

To fix this issue you need to add the following registration key (Reboot needed to take effect)

hashtag
Backwards Compatibility

For backwards compatibility we created an Obsolete PersitentObjectTypes class (old version). The only thing you need todo when upgrading to the new source generator is changing the using in de .csproj project file by adding the Generated.Obsolete namespace.

This way the project wil run as before.

Note: If you add the new usings directly you can use de CodeFix to update to the correct code.

Reports

The reports feature offers developers the capability to securely expose data queries in various formats such as XML, JSON, and CSV. This ensures that data can be accessed externally while maintaining security through authentication and tokenization.

hashtag
Token

Reports make use of a secure random (384bit) token to access the specified query. This token should be kept private and not shared with anyone as they will be able to access the report with it.

Index Generator

  • Model Generator

  • ProjectTargetType Generator

  • ProgramUnitNames

  • ProgramUnitItemsNames

  • QueryNames

  • QuerySources

  • ActionNames

  • Languages

  • MessageKeys and Messages

  • AppRoles

  • WebsiteNames

  • Obsolete.PersistentObjectTypes

  • Index class.
  • A V{Entities} property on the Context if it does not already exist.

  • Only the IId interface will be copied to the QueryType.

    IndexReference: You can include a property from the Reference in the index by adding one attribute per property and defining the path on the reference. This can be more than one level deep.

    Note:

    • If the Reference is Nullable, then every generated IndexReference property is also Nullable.

    • Path cannot contains a Collection property.

    Migration scripts for v5 Repository database

    circle-exclamation

    Make sure you have a backup before running the scripts

    public partial class CompanyActions
    {
        [InitializeByCtor]
        private readonly IMyService myService;
    }
    [GenerateIndex]
    public partial class Customer
    {
        public string Id {get; set;}
    
        [Search]
        public string Name {get; set;}
    
        [IgnoreForIndex]
        public string Private {get; set;}
    
        [IndexReference(nameof(Person.Name), Search = true)]
        [IndexReference("Address.CityName")]
        [Reference(typeof(Person)]
        public string Person {get; set;}
    }
    <ItemGroup>
      <AdditionalFiles Include="App_Data\**\*.json" />
      <Using Include="$(MSBuildProjectName).Service.Generated" />
      <Using Alias="Types" Include="$(MSBuildProjectName).Service.Generated.PersistentObjectTypes.$(MSBuildProjectName)" />
      <Using Alias="AttributeNames" Include="$(MSBuildProjectName).Service.Generated.PersistentObjectAttributeNames.$(MSBuildProjectName)" />
      <Using Alias="QueryNames" Include="$(MSBuildProjectName).Service.Generated.QueryNames.$(MSBuildProjectName)" />
      <Using Alias="QuerySources" Include="$(MSBuildProjectName).Service.Generated.QuerySources.$(MSBuildProjectName)" />
    </ItemGroup>   
    <ItemGroup>
      <AdditionalFiles Include="appsettings.json" />    
    </ItemGroup>
    is_global = true
    
    # Source Generators
    disable_model_source_generator = true
    <NoWarn>VIDYANO0010</NoWarn>
    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
    reg ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1
    <Using Alias="Types" Include="Fleet.Service.Generated.Obsolete.PersistentObjectTypes.Fleet" />
    -- Logs
    if COL_LENGTH('Vidyano.Logs', 'ExternalId') is null
    begin
    	exec sp_rename 'Vidyano.Logs.Id', 'ExternalId', 'COLUMN';
    	alter table Vidyano.Logs add Id bigint identity
    	alter table Vidyano.Logs alter column Type tinyint not null
    	alter table Vidyano.Logs alter column CreatedOn datetimeoffset(3) not null
    
    	alter table Vidyano.Logs drop constraint [PK_Vidyano_Logs]
    	alter table Vidyano.Logs add constraint PK_Logs primary key(Id)
    
    	CREATE UNIQUE NONCLUSTERED INDEX [AK_Logs] ON [Vidyano].[Logs] ([ExternalId])
    
    	--CREATE NONCLUSTERED INDEX [IX_Logs_PERF1] ON [Vidyano].[Logs] ([CreatedOn] DESC)
    end
    
    -- Settings
    if COL_LENGTH('Vidyano.Settings', 'Id') is not null
    begin
    	declare @keyLength int = COL_LENGTH('Vidyano.Settings', 'Key')
    	if @keyLength = -1 or @keyLength > 255
    	begin
    		alter table Vidyano.Settings alter column [Key] nvarchar(255) not null
    	end
    
    	alter table Vidyano.Settings drop constraint [PK_Settings]
    	alter table Vidyano.Settings drop column [Id]
    	alter table Vidyano.Settings add constraint [PK_Settings] primary key ([Key])
    end
    
    -- Users/UserGroup/Users_Group
    SET ANSI_PADDING ON
    
    IF (OBJECT_ID('[Vidyano].[Groups]', N'U') is null)
    BEGIN 
    
    -- Move Groups to separate table
    select u.[Id], u.[Name], u.IsSystem, u.CreationDate, g.TwoFactorRequired
    	into [Vidyano].[Groups]
    	from [Vidyano].Users u
    	inner join [Vidyano].[Users_Group] g on g.[Id] = u.[Id]
    
    alter table [Vidyano].[Groups] add constraint [PK_Groups] primary key ([Id])
    alter table [Vidyano].[Groups] add constraint [UQ_Groups_Name] UNIQUE NONCLUSTERED ([Name])
    
    -- Switch to Groups table
    ALTER TABLE [Vidyano].[UserGroup] DROP CONSTRAINT [FK_UserGroup_Group]
    ALTER TABLE [Vidyano].[UserGroup]  WITH CHECK ADD  CONSTRAINT [FK_UserGroup_Group] FOREIGN KEY([Groups_Id]) REFERENCES [Vidyano].[Groups] ([Id])
    ALTER TABLE [Vidyano].[UserGroup] CHECK CONSTRAINT [FK_UserGroup_Group]
    
    END
    go
    
    if COL_LENGTH('Vidyano.Users', 'IsSystem') is not null
    begin
    
    alter table Vidyano.Users drop column IsSystem
    
    end
    go
    
    if COL_LENGTH('Vidyano.Users', 'IsEnabled') is null
    begin
    
    alter table Vidyano.Users add
    	IsEnabled bit constraint DF_Users_IsEnabled default 1 not null
    	,TwoFactorToken varchar(100) null
    	,ResetPasswordNextLogin bit constraint DF_Users_ResetPasswordNextLogin default 0 not null
    
    declare @constraint nvarchar(256)
    
    select @constraint=d.name from  sys.tables t
    inner join sys.schemas s ON s.schema_id = t.schema_id
    inner join sys.default_constraints d on d.parent_object_id = t.object_id
    inner join sys.columns c on c.object_id = t.object_id
    and c.column_id = d.parent_column_id
    where 
    t.name = N'Users'
    and s.name = N'Vidyano' 
    and c.name = N'Version'
    
    IF LEN(ISNULL(@constraint, '')) <> 0
    BEGIN
        DECLARE @sqlcmd VARCHAR(MAX)
        SET @sqlcmd = 'ALTER TABLE [Vidyano].[Users] DROP CONSTRAINT' +  QUOTENAME(@constraint);
        EXEC (@sqlcmd);
    END
    
    alter table Vidyano.Users alter column Version varchar(100) not null
    
    exec ('update [Vidyano].[Users] set
    	IsEnabled = case when JSON_VALUE(Profile, ''$.Disabled'') = ''true'' then 0 else 1 end
    	, TwoFactorToken = JSON_VALUE(Profile, ''$.TwoFactorToken'')
    	, ResetPasswordNextLogin = case when JSON_VALUE(Profile, ''$.ResetPasswordNextLogin'') = ''true'' then 1 else 0 end
    	, Profile = JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(Profile, ''$.Disabled'', NULL), ''$.TwoFactorToken'', NULL), ''$.ResetPasswordNextLogin'', NULL)
    	from Vidyano.Users 
    	where Profile is not null')
    
    end
    go
    
    declare @keyLength int = COL_LENGTH('Vidyano.Users', 'Language')
    if @keyLength = -1 or @keyLength > 10
    begin
    	update [Vidyano].[Users] set [Language] = '' where [Language] is null
    	alter table [Vidyano].[Users] alter column [Language] varchar(10) not null
    end
    
    set @keyLength = COL_LENGTH('Vidyano.Users', 'CultureInfo')
    if @keyLength = -1 or @keyLength > 10
    begin
    	update [Vidyano].[Users] set [CultureInfo] = '' where [CultureInfo] is null
    	alter table [Vidyano].[Users] alter column [CultureInfo] varchar(10) not null
    end
    go
    
    IF (OBJECT_ID('[Vidyano].[UserSettings]', N'U') is null)
    BEGIN 
    
    exec('select Id, [Settings]
    	into [Vidyano].[UserSettings]
    	from [Vidyano].Users
    	where len([Settings]) > 2')
    
    alter table [Vidyano].[UserSettings] add constraint PK_UserSettings primary key (Id)
    alter table [Vidyano].[UserSettings] alter column [Settings] nvarchar(max) not null
    alter table [Vidyano].[UserSettings] add constraint [FK_UserSettings_Users]
        foreign key ([Id])
        references [Vidyano].[Users] ([Id])
        on delete cascade on update no action;
    
    alter table [Vidyano].Users drop column [Settings]
    
    end
    go
    
    IF (OBJECT_ID('[Vidyano].[UserProfiles]', N'U') is null)
    BEGIN 
    
    exec('select Id, [Profile]
    	into [Vidyano].[UserProfiles]
    	from [Vidyano].Users
    	where len([Profile]) > 2')
    
    alter table [Vidyano].[UserProfiles] add constraint PK_UserProfiles primary key (Id)
    alter table [Vidyano].[UserProfiles] alter column [Profile] nvarchar(max) not null
    alter table [Vidyano].[UserProfiles] add constraint [FK_UserProfiles_Users]
        foreign key ([Id])
        references [Vidyano].[Users] ([Id])
        on delete cascade on update no action;
    
    alter table [Vidyano].Users drop column [Profile]
    
    end
    
    -- ClientCodeSnippets (was used in v1 web client)
    drop table if exists Vidyano.ClientCodeSnippets
    
    -- Group flattening (groups are no longer member of another group)
    IF (OBJECT_ID('[Vidyano].[TmpGroupGroups]', N'U') is null)
    BEGIN
    exec('select Users_Id, Groups_Id
    	into Vidyano.TmpGroupGroups
    	from Vidyano.UserGroup where Users_Id in (select Id from Vidyano.Groups)');
    END
    
    -- Drop old inherited Users_Group table
    drop table if exists [Vidyano].[Users_Group]
    
    -- Delete groups from Vidyano.Users
    delete from Vidyano.UserGroup where Users_Id in (select Id from Vidyano.Groups)
    delete from Vidyano.Users where Id in (select Id from Vidyano.Groups)
    
    -- Flatten groups
    ;WITH cte AS (
    SELECT tmp.[Users_Id]
    	,ug.Name GroupName
          ,tmp.[Groups_Id]
    	  ,gg.Name MemberOf
      FROM [Vidyano].[TmpGroupGroups] tmp
    	inner join Vidyano.Groups ug on ug.Id = tmp.Users_Id
    	inner join Vidyano.Groups gg on gg.Id = tmp.Groups_Id
    
    union all
    
    SELECT cte.[Users_Id]
    	,cte.GroupName
          ,tmp.Groups_Id
    	  ,gg.Name MemberOf
      FROM [Vidyano].[TmpGroupGroups] tmp
      inner join cte on cte.Groups_Id = tmp.[Users_Id]
    	inner join Vidyano.Groups gg on gg.Id = tmp.Groups_Id
    )
    insert into Vidyano.UserGroup (Users_Id, Groups_Id)
    select distinct ug.Users_Id, cte.Groups_Id
    	from Vidyano.UserGroup ug
    	inner join cte on cte.Users_Id = ug.Groups_Id
    except
    select ug.Users_Id, ug.Groups_Id from Vidyano.UserGroup ug
    
    -- Update repository version
    update Vidyano.Settings set Value='61' where [Key]='RepositoryVersion'
    hashtag
    Access

    Depending on the sensitivity of the data you can use 3 options to access a report.

    • IdWithToken: You can pass the token as a query parameter (e.g. https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKENarrow-up-right)

    • AuthorizationHeader (Recommended): This method uses the Authorization header to pass the token. The main benefit is that the token won’t be accidentally exposed in places where the request url is logged (i.e. diagnostics).

    • (Best security): This method needs custom code to generate a HMAC256 signature for the requested resource. The benefits are that the key is never send across the wire and that the request can’t be replayed at a later time.

    You can configure the minimum access level that should be used on a report. When it is accessed using a lesser secure option it will be flagged as compromised and it will not be available unless a new token has been generated.

    hashtag
    Format

    Reports return XML by default. You can use the format query parameter or Accept header to request the data as json (application/json), csv (text/csv) or tsv (text/tab-separated-values).

    Examples:

    • https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKEN&format=jsonarrow-up-right

    • https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKEN&format=csvarrow-up-right

    • curl:

    hashtag
    AuthorizationHeader

    This option expects the token to be passed as Authorization header using the Bearer scheme when accessing the report.

    hashtag
    curl

    hashtag
    JavaScript

    hashtag
    PowerShell

    hashtag
    AuthorizationSignature

    The signature is generated by including a Date header (containing a RFC1123 formatted UTC date and time), an Accept header (containing application/json, text/xml, text/csv or text/tab-separated-values) and using HMAC256 to sign the combination of the request url, accept and timestamp using a newline separator with the token as key. The Date header will be validated that it is no more than 5 minutes in the past or future (to allow for some clock skewing).

    hashtag
    .NET

    hashtag
    PowerShell

    hashtag
    Postman

    For testing you can also use Postmanarrow-up-right as it allows for Pre-request scripts and variables:

    hashtag
    Compromised

    When a report is accessed using a less secure option than configured or using http instead of https it will be flagged as compromised. A log entry will be written with information about the requested url, ip and user-agent.

    You can re-enable the report by giving it a new token. On a production deployment the patching feature can be used to regenerate the token.

    hashtag
    Excel

    Reports can be used to import data in an Excel file. The data will be linked to the Excel table so that it can be refreshed manually or automatically when the file is opened.

    This can be done by starting the From Web wizard in Excel:

    In the wizard you can switch to Advanced mode where you can add the Authorization header:

    hashtag
    Paging / Sorting

    Using top and/or skip also requires sorting to provide consistent results.

    Examples:

    • https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKEN&format=json&$orderBy=FirstName&$top=100&$skip=100arrow-up-right

    • https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKEN&format=csv&$orderBy=LastName+DESC&$top=100arrow-up-right

    For the AuthorizationSignature option you’ll need to include the whole url as requested (which shouldn’t contain the token and format in that case, the format should be in the Accept header) for the signature calculation.

    hashtag
    Filtering

    You can use the $filter query parameter to include the text-search (as used inside a Vidyano application in the search box on a query) that should be used to filter.

    Examples:

    • https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKEN&format=json&$filter=FirstName:Stevearrow-up-right

    • https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea?token=TOKEN&format=csv&$filter=FirstName:Steve+LastName:Hansenarrow-up-right

    For the AuthorizationSignature option you’ll need to include the whole url as requested (which shouldn’t contain the token and format in that case, the format should be in the Accept header) for the signature calculation.

    Migrating an existing Vidyano v5 project

    Because Vidyano v6 uses ASP.NET Core and EntityFrameworkCore most migrating steps are related to this (and any online tutorial for upgrading to ASP.NET Core will help in this step). Below are the general steps needed to get you up and running.

    • Create a new project using the above steps (this will create a correct project for .NET core and the correct startup logic)

    • As with most tutorials, it is now time to copy over the existing code you had (.NET core no longer has the path of different files inside your .csproj file so you can just copy them over folder wise)

    • Service goes to Service folder, static webrelated files for to wwwroot, App_Data goes to wwwroot/App_Data

    • A few exceptions are needed, for the *Advanced/*AuthenticatorService/*BusinessRules/*Queries/*Web it is best to copy the methods/properties/fields in the existing classes where possible

    • Any existing NuGet references that the application had will need to be added again (as PackageReference, the packages.json is no longer valid)

    • Any appSettings/connectionStrings from web.config need to be copied over in the appsettings.json file, Vidyano.X settings go inside the Vidyano object (<add key="Vidyano.X" value="True" /> becomes {"Vidyano":{"X": true}})

    • Vidyano v6 (and .NET Core/ASP .NET Core) makes great use of DI, that's why all PersistentObjectActions implementation now require a default constructor that at least excepts the TContext as a parameter, other services can now be constructor injected there as well.

    • Your existing EntityFramework DbContext needs to be upgraded to EntityFrameworkCore. Some notable/recommended changes

      • Make sure properties are virtual (the Proxy package is included but needs to be enabled manually)

      • Mark InverseProperties where needed

    • You existing *Web also needs some updates, ASP.NET Core no longer uses HttpResponseMessage so all custom api methods needs to be updated to use IActionResult as return type (that exact type).

    • *Advanced also has most breaking changes (deprecated code has been dropped, ...)

    Architecture

    hashtag
    Groups / Rights

    Functionality is driven by giving groups (application roles) specific rights to actions (e.g. Save, New, Delete, Print, Export, …). Without an explicit right for an action the user won’t be able to execute the action and the backend will throw an exception.

    Query, Read, Edit and New rights can be defined at the attribute (property/column) level, all other actions can be defined at the persistent object (class/table) level.

    hashtag
    Authentication

    Vidyano application can be configured to allow multiple authentication sources which all map to users that can be assigned to groups.

    hashtag
    Vidyano Authentication

    Enabled by default, allows the usage of any custom name and password to log in. Passwords are stored in the database using a BCrypt hash. The BCrypt complexity can be configured and is increased by the framework on regular intervals (currently at 13). Will require a password with at least a length of 8 and it should not be in the blacklist (currently a list of the top 25 worst passwords and Pwned Passwords using the V2 range API), can be configured to use a different length, complexity (no longer recommended) or a different blacklist.

    Password requirements are based on and

    The service is used to validate that passwords don’t appear on any leaked password list. The new V2 api is used with the Range API to provide k-anonymity to check for breached password without disclosing the actual password (or even a full hash of it).

    hashtag
    ADFS Authentication

    Allows the use of an Active Directory Federation Service to authenticate the user in the application. The application can be configured to automatically put unknown authenticated users in specific group or this logic can be handled using code (to put the user in a specific group based on the returned claims). Will use the http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname claim as user name.

    hashtag
    OAuth Authentication Providers

    Allows the use of an OAuth provider (Microsoft, Google, Facebook, Twitter or Yammer) to authenticate the user in the application. Can also be configured to automatically create unknown users. Will use the email as user name.

    Auth Token\

    Once the user has been authenticated the server will return an auth token to the client that can be used for the next requests.

    The token is a SHA256 hash composed of the following information:

    • Application salt

    • User name

    • User version (incremental number in the database that is increased when the password is changed or the user is disabled)

    The actual IP address to check can be configured to allow switching between addresses within a specific cidr range in case the users have multiple external IP address or it can be changed using code.

    hashtag
    Security Token

    To ensure that the client works with the correct model (based on the rights) the server will generate a security token that can be checked when the persistent object is send back.

    The token is a SHA256 hash composed using the following code:

    The token uses a random salt to prevent any oracle attacks. All information is included so that the client can only modify the entity as it was sent by the server with only the attributes that were available. For attributes that the user has no edit rights the actual value is also used in the token so that the application can securely set these attributes on the server-side. Trying to modify any of the data will result in an exception being thrown by the backend.

    \

    hashtag
    Force Https / TLS 1.2

    Vidyano will automatically redirect to https:// for certain subdomains (azurewebsites.net, apphb.com, …) and can be configured with a simple appSetting for custom domains. Enabling this flag will also enable HSTS (Strict Transport Security) which tells the browser to always go the https:// site directly even if the user tries to go to http:// to block MITM attacks.

    Depending on the deployment it is recommended to only allow TLS 1.2 if possible. This can be enabled for Microsoft Azure App Services on the SSL settings tab:

    hashtag
    Two-factor authentication

    Each user can set its own two-factor code on the user settings page (available using the gear in the lower left of the application). The application can also be configured to require (force) two-factor authentication for users that are in a specific group (e.g. Administrators).\

    curl -H 'Authorization: Bearer TOKEN' 'https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea'
    curl -H 'Accept: application/json' 'https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea'
    curl -H 'Accept: application/json' -H 'Authorization: Bearer YOUR_TOKEN_HERE' 'https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea'
    var token = "YOUR_TOKEN_HERE";
    var reportUrl = "https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea";
    var headers = {
      "Accept": "application/json",
      "Authorization":"Bearer " + token
    };
    fetch(reportUrl, { headers: headers })
      .then(function (response) {
        return response.json();
      })
      .then(function (json) {
        var data = json.d; // Array with the objects
        console.log(data)
      });
    $token = 'get token from secure setting/vault'
    $reportUrl = 'https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea'
    $headers = @{"Accept"='application/json';"Authorization"='Bearer '+$token}
    $data = (Invoke-WebRequest $reportUrl -Headers $headers | ConvertFrom-Json).d
    var token = "YOUR_TOKEN_HERE"; // It's recommended to get this from a setting/vault/configuration/...
    var reportUrl = "https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea";
    var accept = "application/json";
    var date = System.DateTime.UtcNow;
    var timestamp = date.ToString("R", System.Globalization.CultureInfo.InvariantCulture);
    var messageSignature = string.Join("\n", reportUrl, accept, timestamp);
    
    string signature;
    using (var hmac = new System.Security.Cryptography.HMACSHA256(System.Text.Encoding.UTF8.GetBytes(token)))
        signature = Convert.ToBase64String(hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(messageSignature)));
    
    var request = System.Net.WebRequest.CreateHttp(reportUrl);
    request.Accept = accept;
    request.Date = date;
    request.Headers.Add("Authorization", "Bearer " + signature);
    $token = 'get token from secure setting/vault'
    $reportUrl = 'https://localhost:44332/GetReport/4cb4854ca87a4e4aaf66c8f2469d58ea'
    $accept = 'application/json'
    $timestamp = [System.DateTime]::UtcNow.ToString('R')
    $messageSignature = "$reportUrl`n$accept`n$timestamp"
    
    $hmac = New-Object System.Security.Cryptography.HMACSHA256
    $hmac.Key = [Text.Encoding]::UTF8.GetBytes($token)
    $signature = [Convert]::ToBase64String($hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($messageSignature)))
    
    $headers = @{"Accept"=$accept;"Date"=$timestamp;"Authorization"='Bearer '+$signature}
    $data = (Invoke-WebRequest $reportUrl -Headers $headers | ConvertFrom-Json).d
    // Pre-request Script
    var token = pm.environment.get("token");
    var reportUrl = request.url;
    var accept = "application/json";
    var timestamp = (new Date()).toGMTString();
    var messageSignature = [reportUrl, accept, timestamp].join("\n");
    
    var signature = CryptoJS.HmacSHA256(messageSignature, token).toString(CryptoJS.enc.Base64);
    
    pm.globals.set("accept", accept);
    pm.globals.set("timestamp", timestamp);
    pm.globals.set("encrypted_signature", "Bearer " + signature);
    Mark ForeignKey where needed
  • Mark classes with Table attribute

  • Remove Index attribute (needs to be configured in OnModelCreating)

  • Managing User Secrets

    During development it is recommended to store connection strings, salts, or other secrets in a secure manner. It is best to avoid storing these secrets in the code or local configuration files.

    In .NET Core, you will want to take advantage of the secrets manager. You can find more information here: https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.1&tabs=windowsarrow-up-right

    In Visual Studio 2019, you can access these via right-click on your project and select Manage User Secrets.

    In Visual Studio Code, you can install the following extension to get the same behavior: https://marketplace.visualstudio.com/items?itemName=Reptarsrage.vscode-manage-user-secretsarrow-up-right

    3.0

    Coming soon

    Service

    v6 release notes

    Instead of actual release notes per version we maintain a list of various new features we introduced over the years

    Changelog 2025chevron-right
    Expiry date and time
  • IP address

  • Optionally the original user when an user is impersonated

  • Microsoft’s Password Guidancearrow-up-right
    NIST’s Digital Identity Guidelinesarrow-up-right
    https://haveibeenpwned.com/Passwordsarrow-up-right
    AuthorizationSignature

    Instant Search

    Vidyano has the ability to set any Query as Global Search which allows the end users to use a simple text search in the menu that will search through all the queries and shows those queries that returned results (or errors). This has given us an easy way to provide this kind of functionality to users.

    The only problem has always been performance, the application will launch a full text search for all columns on all the queries that are defined as global search so the total time to give results has always been in the 1-10 seconds range.

    Instant search has been written from the ground up with performance as the number one priority.

    hashtag
    Example

    Instant search is implemented as an advanced feature, it is up to the developer to keep the total processing time as low as possible (recommended <100ms).

    Which will give the following experience to the end user, as seen on

    Azure AD SAML based Sign-on

    Vidyano can be configured to use Azure AD as an authentication provider. In combination with the SCIM feature to provision the users and groups you could use the Azure AD to completely control your users outside the application.

    hashtag
    Configuration

    You’ll need to set the Single Sign-on Mode to SAML-based Sign-on.

    For the URLs you should use the url of the application for Identifier and followed by Authenticate/SAML2 as Reply URL:

    The Configure button at the bottom will give your the correct settings (SSO Service Url and Base64 Certificate) that you need to use on the Security page.\

    Vidyano Documentation

    This documentation will help you build powerful data-driven applications using the Vidyanoarrow-up-right application platform.

    hashtag
    Getting started Section

    For developers ready to dive in, the Getting Started section provides the necessary steps to install tools and create a new project with Vidyano.

    hashtag
    Documentation Sections

    The provides insights into the various concepts within a Vidyano project. It details their functionalities and guides on how to effectively utilize them in your applications. Developers can leverage this knowledge to enhance their projects and maximize the platform's potential.

    hashtag
    Current versions

    Here are a few badges with the latest versions of various packages used for Vidyano projects

    SCIM 2.0 Service Provider

    The SCIM standard was created to simplify user management in the cloud by defining a schema for representing users and groups and a REST API for all the necessary CRUD operations. See specarrow-up-right

    hashtag
    Example

    To enable the SCIM end-point Vidyano will require an authenticated request, the passed bearer token will need to be checked in the AuthenticatorService class. The easiest way would be to provide a single custom setting that contains the token so that it can be checked.

    public override bool CheckScimCredentials(ScimCredentials credentials)
    {
        var setting = Manager.Current.GetSetting("ScimBearerToken");
        return !string.IsNullOrEmpty(setting) && setting == credentials.Token;
    }

    Other scenarios could be created by storing multiple tokens in the database.

    hashtag
    Azure AD

    Azure can be configured to sync the AD users with your Vidyano application:

    Tenant URL is the url of the application (e.g. for the demo application the tenant url is https://demo.vidyano.com/ )

    For the mapping we recommended the following settings: Groups

    Users

    public override string GetClientIpAddress(string userName, string ipAddress)
    {
        if (userName == "salesguy") // NOTE: Always on the road
            return Manager.Current.GetUser(userName).Profile["AuthTokenSalt"];
    
        return base.GetClientIpAddress(userName, ipAddress);
    }
    private string GetTamperingDetectionToken(string securityToken)
    {
        string salt;
        if (securityToken == null)
            salt = ObjectEx.GetSecureRandomString(6);
        else
            salt = securityToken.Substring(1, 8);
    
        var allData = new StringBuilder();
        allData.AppendLine(salt);
        var poSalt = VidyanoDbCache.Default.GetPersistentObject(Id, false)?.Salt;
        if (poSalt != null)
            allData.AppendLine(poSalt);
        allData.AppendLine(Id.ToString());
        allData.AppendLine(ObjectId);
        if (BulkObjectIds != null)
            BulkObjectIds.Run(id => allData.AppendLine(id));
    
        Attributes.OrderBy(a => a.Id).Run(attr =>
        {
            allData.AppendLine(attr.Id.ToString());
            if (attr.IsReadOnly && !attr.Name.Contains("."))
            {
                var attrWithReference = attr as PersistentObjectAttributeWithReference;
                allData.AppendLine(attrWithReference != null ? attrWithReference.ObjectId : attr.Value);
                allData.Append(attr.IsValueChanged);
                allData.AppendLine();
            }
        });
    
        allData.AppendLine(SecurityScope.ApplicationSalt);
        var result = allData.ToString().GetSHA256();
        return "$" + salt + result;
    }

    Previous

    demo.vidyano.comarrow-up-right
    documentation
    arrow-up-right
    arrow-up-right
    arrow-up-right
    arrow-up-right
    arrow-up-right
    Using System for Cross-Domain Identity Management to automatically provision users and groups from Azure Active Directory to applicationsarrow-up-right

    Changelog 2020

    hashtag
    December 2020

    hashtag
    New Features

    hashtag
    RavenDB 5.1

    • Switched RavenDB to version 5.1 (#289)

    • Major version upgrade with performance improvements

    hashtag
    Application Virtual Path

    • Let Advanced handle ApplicationVirtualPath

    • Added ApplicationVirtualPath to GetRequestUri

    hashtag
    Fixes

    • Fixed issue when GetSettingEntity is used with locked value

    • Fixed issue #288

    hashtag
    Maintenance

    • Reduced usage of internal members for provider packages

    • Removed dependency on internal Profiler class

    • Web2Cdn changes

    hashtag
    November 2020

    hashtag
    New Features

    hashtag
    .NET 5.0 Support

    • Added .NET 5.0 target framework

    • Updated to latest framework version

    hashtag
    Configuration

    • Added DisableLogDeletion configuration option

    • Better control over log retention

    hashtag
    Mail Features

    • Added support for SmtpClient.PickupDirectoryLocation

    • MailImplementation missing features added

    hashtag
    Fixes

    • Fixed NRE when websites.json is invalid

    • Handle Log offset on Linux

    hashtag
    Maintenance

    • Updated Eazfuscator to 2020.3

    • Updated NuGet packages

    • Fixed contentFiles handling

    • Handle Eazfuscator obfuscation issues

    hashtag
    October 2020

    hashtag
    New Features

    hashtag
    KeyValueList Support

    • Added KeyValueList support

    • Better handling of key-value data

    hashtag
    Custom Queries

    • Discover and sync CustomQueries

    • Automatic discovery and synchronization

    hashtag
    Mail Service

    • Prefer IMailService interface

    • Better mail service abstraction

    hashtag
    RavenDB Enhancements

    • Added IConcurrencyTokenHandler

    • Added AddObject overload method

    • Prefer interface usage

    • Implement most needed cases on POAReference

    hashtag
    Fixes

    • Fixed exception when UserName is missing in body and no Authorization header is given

    • Fixed roundtrip handling for ConcurrencyToken

    • Fixed obfuscation issue

    hashtag
    Maintenance

    • Made RepeatingJobs async

    • Remove temp type if not used

    • Use generic internal metadata on PO for extra client data

    hashtag
    September 2020

    hashtag
    New Features

    hashtag
    Security Enhancements

    • Security changes and fixes

    • Better security handling

    hashtag
    CORS Support

    • Added UseVidyano CORS hook

    • Enable CORS configuration

    hashtag
    Model Hashing

    • Added model hashes

    • Better model versioning

    hashtag
    Fixes

    • Fixed issue with static resource requests being passed to GetIndex

    • Don't fail when trying to include RequestId in Exception message

    • Fixed issue with repeating job using wrong TimeZone offset

    hashtag
    Maintenance

    • Performance: string optimizations (array vs string)

    • Split Where in Where/ApplyDataSecurity

    • Handle string to JObject, better exception message

    hashtag
    August 2020

    hashtag
    New Features

    hashtag
    Time Zone Handling

    • TimeZoneHandling changes

    • Better timezone support

    • Naming consistency in TimeZoneInfo

    hashtag
    User Management

    • Added CreateNewUser overload to add user to multiple groups

    • Better user creation options

    hashtag
    Computed Attributes

    • Allow computed attribute with nested property

    • Added HasComputedAttribute method

    hashtag
    Fixes

    • Fixed issue #285

    • Typo in ExceptionHandlerService RequestId logging

    hashtag
    Maintenance

    • VidyanoDbCache.GetUserOrGroup(name)

    • Allow nested dynamic properties

    • Optional metadata for ValueObject

    hashtag
    July 2020

    hashtag
    New Features

    hashtag
    Configuration

    • Expose IVidyanoConfiguration

    • Better configuration access

    hashtag
    Maintenance

    • Skip EAZ for RavenDB

    • Allow nested dynamic properties

    • Optional metadata for ValueObject

    hashtag
    June 2020

    hashtag
    New Features

    hashtag
    Cache Updates

    • EFCore cacheupdate basic implementation

    • Improved performance for LastLoginDate cacheupdate

    • CacheUpdates improvements

    hashtag
    RavenDB Features

    • RavenDB: Prefer waiting for indexes when saving changes

    • RavenDB: Allow easier customization of DocumentConventions

    • RavenDB: Added ITargetRavenDBContext

    hashtag
    Fixes

    • Fixed issue when synchronizing EF model

    • Fixed synchronize issue when multiple ValueObjects exist

    • Fixed translations issue

    hashtag
    Maintenance

    • Better Excel invalid xml chars handling

    • Optionally use certificate store for RavenDB certs

    • Allow App_Data in ContentRoot

    hashtag
    May 2020

    hashtag
    New Features

    hashtag
    Charts

    • WIP line chart implementation

    • Charts: Move BarChart to ProviderSpecificChartService

    • WIP provider specific chart service

    hashtag
    RavenDB Enhancements

    • RavenDB: Document expiration for logs

    • RavenDB: Document expiration for RegisteredStream

    • RavenDB: Prefer appsettings for connection info

    hashtag
    Fixes

    • Fixed GetReport

    • Fixed updatable log not working in EFcore

    • Fixed ExecuteAction with input file not working

    hashtag
    Maintenance

    • Trust Cloudflare as a proxy

    • Also flag Edge as outdated

    • ArrayDeconstructionExtensions added

    • Expose NeedsSimplifiedExpression

    hashtag
    April 2020

    hashtag
    New Features

    hashtag
    Major Architecture Overhaul

    • BREAKING: Complete repository provider abstraction

    • Split User/Group functionality

    • Added IRepositoryUserStore

    hashtag
    Dependency Injection

    • Use DI for creating PersistentObjectActions objects

    • Extra DI changes

    • Updated group actions for DI

    hashtag
    Configuration

    • Added VidyanoConfiguration

    • Create random salts/token on startup if needed

    • Allow extra data on JWT token

    hashtag
    Schema Synchronization

    • Finalized EF Core schema synchronizer

    • Added schema synchronizer for non-EF model

    hashtag
    Fixes

    • Fixed GetDiagnostics/Api not working

    • Fixed invalid initial schema SQL

    • Fixed issue with invalid PK type for Vidyano.Logs

    hashtag
    Maintenance

    • Removed License PO

    • Working RavenDB implementation

    • Added EntityFrameworkCore logging

    • Only create new ServiceScope if needed

    hashtag
    March 2020

    hashtag
    New Features

    hashtag
    Service Worker

    • Added service worker support

    • Better offline capabilities

    hashtag
    Value Objects/ViewModels

    • Added ValueObject/ViewModel attribute

    • Better data modeling support

    hashtag
    Nullable Reference Types

    • WIP #nullable support throughout codebase

    • Better null safety

    hashtag
    In-Memory Logging

    • Added InMemoryLogProvider

    • Removed DisableLogs

    hashtag
    Fixes

    • Fixed index.html for Chrome80

    • Fixed issue with not being able to search on computed displayattribute

    • Fixed obfuscation issues

    hashtag
    Maintenance

    • Set up CI with Azure Pipelines

    • Removed dependency on IObjectContextAdapter

    • Expose GetTextSearchExpressionForXXColumn helpers

    hashtag
    February 2020

    hashtag
    New Features

    hashtag
    Exception Handling

    • Tweaked exception handling for /Authenticate calls

    • Better error handling

    hashtag
    Fixes

    • Handle failed loaded cache for WebControllerLogger

    hashtag
    January 2020

    hashtag
    New Features

    hashtag
    Advanced Search

    • Tweaked Advanced Search Save/Load functionality

    • Better search capabilities

    hashtag
    Fixes

    • Fixed issue when searching ref attr with missing breadcrumb columns

    • Fixed issue with AdvancedSearch ExportToExcel not working

    hashtag
    Maintenance

    • Trim userName input for GetCredentialType

    • Updated copyright year to 2020


    Note: 2020 was a major refactoring year with the complete overhaul of the repository provider system, introduction of RavenDB support, and migration to .NET 5.0. Many breaking changes were introduced to support provider abstraction.

    Changelog 2022

    hashtag
    December 2022

    hashtag
    New Features

    hashtag
    Configuration Enhancements

    • Added ShowAppInformation config option

    • Added UseRichLogs config for enhanced logging

    • Added more IVidyanoConfiguration comments for better documentation

    hashtag
    User Rights Management

    • Added OnlyGroupRights feature (#348)

    • Better control over permission inheritance

    hashtag
    Fixes

    • Fixed issue when setting lazy loaded references to null

    • Fixed IUpdateableLog.Append/Prepend adding extra newlines (RavenDB)

    • Fixed some issues when AsDetail is used on virtual PO

    hashtag
    Maintenance

    • Dropped .NET Core 3.1 support (end of life)

    • Updated packages including Newtonsoft.Json security update

    • Repeating jobs improvements

    hashtag
    November 2022

    hashtag
    New Features

    hashtag
    .NET 7 Support (#351)

    • Added .NET 7.0 support

    • Take advantage of latest framework improvements

    hashtag
    Mail Improvements

    • Enhanced mail functionality

    • Better email handling

    hashtag
    User Management

    • Added IUser.ToggleGroup for easier group management

    hashtag
    Diagnostics

    • Added application/json support for /diagnostics (#352, #354)

    hashtag
    Developer Experience

    • Inform administrator when application had errors or warnings at startup

    • Show extra developer information on PO in management

    hashtag
    Fixes

    • Fixed issue with User/NullableUser not showing for Guid/Guid? properties

    • Fixed issue when GetCollectionName returns null (RavenDB)

    • Fixed text search issue when label was also used as referenced property

    hashtag
    Maintenance

    • Add dummy services for mocking/console apps

    • Proxy tweaks, trust localhost by default

    • RavenDB: Profiler shows when request was from cache

    hashtag
    October 2022

    hashtag
    New Features

    hashtag
    API Enhancements

    • Allow IAsyncEnumerable<> API methods

    • Async streaming support for APIs

    hashtag
    Query Features

    • Added QueryResultItem.GetOriginalValue

    • Better access to original data

    hashtag
    Security

    • Added Security GroupComments

    • Better documentation for security groups

    hashtag
    Management

    • Added Manager.OnInitialized hook

    • Handle Enum KeyValueList

    hashtag
    Helper Methods

    • Added CustomActionArgs.EnsureParent/EnsureQuery

    • Easier parent and query access

    hashtag
    Fixes

    • Fixed performance issue with keeping 1 IRepositoryUserStore in memory

    • Fixed issue when textsearch was replacing invalid labels

    • Fixed Excel issue missing last row

    hashtag
    Maintenance

    • Removed Web2Assembly support

    • Handle ICollection as detail query

    • IRepositoryIdDeterminer is singleton

    hashtag
    September 2022

    hashtag
    New Features

    hashtag
    Report Enhancements

    • Added ReportTokenGenerator

    • Allow per-deployment Report tokens

    • Report/Register expects User

    hashtag
    Helper Methods

    • Added DoIf conditional execution helper

    • Automatic handling of SortExpression based on naming

    hashtag
    Fixes

    • IDataProtectionProvider is only needed for useDataProtection

    hashtag
    Maintenance

    • Added Manager.EnsureUserExists

    • Consistent EOL for .json files

    • Updated packages

    • Unneeded Regex.Replace usage removed

    hashtag
    August 2022

    hashtag
    New Features

    hashtag
    Excel Enhancements

    • Extra Excel hooks for customization

    • Better Excel export control

    hashtag
    Helper Methods

    • Added CustomQueryArgs.EnsureParent helper

    • Easier parent object access

    hashtag
    Fixes

    • Fixed issue #347

    • Also use POA SortExpression when filtering

    hashtag
    Maintenance

    • Security update: Bump System.Security.Cryptography.Xml (#349)

    • Updated packages

    • Code formatting improvements

    hashtag
    July 2022

    hashtag
    New Features

    hashtag
    LookupReference Enhancements

    • Added generic ILookupReference

    • LookupReference.Comment support

    • LookupReference implements IReadOnlyList directly

    hashtag
    TranslatedString Features

    • Added TranslatedString.FromValue

    • Added TranslatedString.IsEmpty

    hashtag
    Persistent Object Features

    • Added IPersistentObjectAdvanced.ForceFromAction

    • Added POA.RemoveRules and PO.RemoveAttributes overloads

    hashtag
    Value Objects

    • Easier support for split value objects

    • Added SplittedValueObjectHandler by default

    hashtag
    Caching

    • Added IAdvancedSessionOperations.AggressivelyCache extension method

    hashtag
    Fixes

    • Improve error messages when ValueObject mapping fails for custom queries

    hashtag
    Maintenance

    • Use NullabilityInfoContext for .NET 6.0

    • Added TotalItemArgs.OnCreated

    • TypeCache changes

    • TODOs and comments

    hashtag
    June 2022

    hashtag
    New Features

    hashtag
    Web3 Support

    • Use web3 by default

    • Improved Web3 detection

    • Web2Cdn improvements for Web3

    hashtag
    Binary File Support

    • Add support for BinaryFile/Image on AsDetail

    • Better file handling in detail views

    hashtag
    Date Search

    • Improved date search on SQL/Raven using date ranges when possible

    • Better date handling and nullable logic

    hashtag
    Development Tools

    • Added .editorconfig for consistent code style

    • Use global using for project target context type

    • Library logic for generators

    hashtag
    Fixes

    • Fixed issue in SystemReferenceData

    • LookupReference serialization issue

    • Issue with PluginManager

    hashtag
    Maintenance

    • Allow multiple FromIndex

    • Removed legacy projects

    • Removed unused TypeCache code

    • Helper DatabaseSettings.CreateStore

    hashtag
    May 2022

    hashtag
    New Features

    hashtag
    Navigation System

    • Added NavigationHints

    • More backend<>frontend information exchange about navigation

    hashtag
    Entity Framework Core

    • Fixed issue with computed attributes not being mapped

    • Disable AsNoTracking()

    hashtag
    Query Enhancements

    • Added OnConstructForColumns hook

    • Auto show queries when adding to PO

    • Allow ExecuteQuery to pass ForReferenceAttribute

    hashtag
    Helper Methods

    • Added IAuthenticatedRequest for better nullability handling

    • Better handling of generic model entities

    • Helper methods on PO/POA

    hashtag
    Fixes

    • Fixed issues when filtering a nullable enum

    • AzureStorageAccount/Container parse issue when appsetting was empty

    • Show more information when KeyValueList query isn't found

    hashtag
    Maintenance

    • RavenDB: Hide unused system settings

    • RavenDB: Keep existing id for reference if we can't load it

    • RavenDB: Combine DB entries

    hashtag
    April 2022

    hashtag
    New Features

    hashtag
    Notification System

    • Introduce NotificationType.Critical

    • Critical notifications support

    hashtag
    Verbose Logging

    • Added option to tweak verbose log content (replace sensitive content)

    • Enable outgoing logging for specific Api call (POST/PUT/etc)

    • Datadog include verbose log id

    hashtag
    Azure Enhancements

    • Use LinqTunnel attribute

    • Azure improvements and TODOs

    hashtag
    Fixes

    • Include web2 cdn response status code

    hashtag
    Maintenance

    • Prefer lazy constructor with direct value if possible

    • Datadog log 400 as warning instead of error

    hashtag
    March 2022

    hashtag
    New Features

    hashtag
    API Enhancements

    • Added BinaryFileConverter

    • Added ILookupReference interface

    • Added ExecuteQueryReason

    hashtag
    Configuration

    • Added IVidyanoConfiguration.ApplicationWebsiteRoot as fallback WebsiteRoot

    • Added AsyncFlow.IsWeb2OrGreater

    hashtag
    Helper Methods

    • Added SetChangedValue(WithRefresh)

    • Expose RepositoryVerboseLogStore.SwapResponseBodyBack

    hashtag
    Fixes

    • Handle /api call with invalid request ContentType

    • Don't set new string property to "" if nullable

    • Allow referenced properties from other assemblies

    hashtag
    Maintenance

    • Removed .NET 5.0 support

    • XML comment ambiguous reference fixes

    • Prefer new() calls

    • Word nullability improvements

    hashtag
    February 2022

    hashtag
    New Features

    hashtag
    Azure Storage

    • Azure storage added more places to retry before failing

    • Improved retry logic

    hashtag
    Value Objects

    • Added ValueObjects.PreferFullRootId

    • Sample code for handling root property on value objects

    hashtag
    API Security

    • Added ApiArgs.GenerateSignedRequest helper

    • Make sure we use the same logic for IsValidSignature

    hashtag
    Fixes

    • Fixed issue #314

    • Fixed issue #323

    • Fixed issue #325

    • IExceptionService tweaks

    hashtag
    Maintenance

    • Nullability improvements

    hashtag
    January 2022

    hashtag
    New Features

    hashtag
    .NET 6 Features

    • .NET 6 typed headers support

    • Prefer .NET 6.0 one-shot methods where possible

    hashtag
    Azure Storage

    • Added AzureStorageContainer

    • Better Azure storage integration

    hashtag
    Builder Support

    • Allow TranslatedString for builder

    hashtag
    Fixes

    • Fixed ApiArgs.IsValidSignature

    • Fixed issue where POA.SortExpression has other type

    • RavenDB enum searching fixes

    hashtag
    Maintenance

    • IHostApplicationLifetime is a singleton

    • Show extra info when IUpdatableLog is in progress

    • Comments Web² vs web 3


    Note: Commits marked with (test) or [skip ci] have been excluded from this changelog as they are internal testing commits.

    Changelog 2023

    hashtag
    December 2023

    hashtag
    New Features

    hashtag
    AsyncStreamingAction

    • Added AsyncStreamingAction for handling streaming responses

    • Added StreamingDialogOptions for customization

    • Added AuthenticatedRequest support on AsyncStreamingAction

    hashtag
    .NET 8.0 Support

    • Added .NET 8.0 support

    • Updated packages to .NET 8

    hashtag
    Builder Enhancements

    • Exposed more information on IBuilder interface

    • Better introspection capabilities

    hashtag
    Fixes

    • Fixed ScimHandler not handling NameInUse correctly

    • Fixed PostgreSQL invalid SQL

    • Re-enabled TypeForwardedAttributes

    hashtag
    Maintenance

    • Removed Eazfuscator obfuscation

    • Better handling of POA column/columnspan

    • Updated Web3

    • Added benchmarker for performance testing

    hashtag
    November 2023

    hashtag
    New Features

    hashtag
    Vidyano.Abstractions Package

    • Added new Vidyano.Abstractions package

    • Moved ServiceLocator to Abstractions

    • Moved IUpdatableLog/LogType to Abstractions

    hashtag
    API Enhancements

    • Added ApiArgs.HttpContext for better request context

    • Added reload when action is changed in Management

    hashtag
    RepeatingJob Features

    • Added RepeatingJob.CanExecute for conditional execution

    • Better job control

    hashtag
    Testing Support

    • Added CustomActionArgs constructors for testing purposes

    hashtag
    Fixes

    • Remove starting, duplicate and end separators from Program Units

    • Reset ObjectId on Save if it failed

    • Correctly dispose CustomAction if created

    hashtag
    Maintenance

    • Updated packages

    • Improved nullability annotations for Manager.GetUser

    • Fixed version for Vidyano.Abstractions

    hashtag
    October 2023

    hashtag
    New Features

    hashtag
    Security Enhancements

    • Added IRepositoryUserRevocationStore interface

    • RavenDB: Use in-memory revocation store

    • RavenDB: Added IRepositoryUserRevocationStore support

    hashtag
    Settings Builder

    • Added ISettingsBuilder.AsReadOnly for read-only settings

    hashtag
    Export Features

    • Added ExportToExcelArgs.IncludedIdColumnName

    • Customize ID column naming in Excel exports

    hashtag
    Tools

    • Added Tool FindMissingDefaultTranslations

    • Helps identify missing translations

    hashtag
    Fixes

    • SECURITY: Fixed F-2023-0639 - Information leakage vulnerability

    • Resolved target context of PO based on context type of POActions (#366)

    hashtag
    Maintenance

    • Keep client code in-sync for Boolean ToDisplayValue

    • Various performance and nullability improvements

    • Updated test projects to Web3

    hashtag
    September 2023

    hashtag
    New Features

    hashtag
    Import/Export Enhancements

    • Added Import/Export of Descriptions

    • Added IncludeId feature for ExportToExcel

    • Better data portability

    hashtag
    MetadataDescription

    • Added MetadataDescription for better metadata handling

    hashtag
    ProgramUnitEx

    • Added ProgramUnitEx for extended program unit functionality

    hashtag
    Fixes

    • Fixed issue #365

    • RepeatingJobHost: Handle TaskCanceledException

    • Fixed loading entity from index in RavenDB

    hashtag
    Maintenance

    • Prefer literal contains for better performance

    • Help developer when reference points to value object

    • Improved fullTypeName handling

    hashtag
    August 2023

    hashtag
    New Features

    hashtag
    ObjectId Enhancements

    • Added ObjectId.FromServiceString method

    • Easier object ID conversion

    hashtag
    Fixes

    • Fixed log type modification bug in DefaultRepositoryProvider

    • Fixed NRE in RavenDB

    • Advanced.IsValidImage fix for .NET 7

    hashtag
    Maintenance

    • Better default logging to exclude EF logging in Console

    • Added RepositoryDocumentSession for separate session management

    • RavenDB: Use correct session when cleaning up verbose log entries

    hashtag
    July 2023

    hashtag
    New Features

    hashtag
    Manager Enhancements

    • Added Manager.EnsureSettingsExist

    • Added Manager.GetRequiredSetting methods

    • Show virtual settings for easy changing

    hashtag
    Entity Framework Improvements

    • GetNextUserVersion support

    • Fix for EF7 (extra SaveChanges)

    • Support for intercepting Vidyano EF modelbuilder (#361)

    hashtag
    Fixes

    • Fixed issue with Web2Cdn being triggered before initializing schema

    • Fixed SQL connection string in tests

    hashtag
    Maintenance

    • CalculatedAttribute requires at least 1 dependentOn property

    • Tweaked parameter naming for PO.AddQuery method

    • Ignore EqualityContract property from records

    hashtag
    June 2023

    hashtag
    New Features

    hashtag
    OpenAPI 3.1 Support

    • Added OpenAPI 3.1 support (#162)

    • Better API documentation

    hashtag
    Program Unit Enhancements

    • Added new ProgramUnitItem Separator type

    • Added Comment to CollectionNameAttribute

    hashtag
    Fixes

    • Fixed NRE (Null Reference Exception)

    • Fixed separator issue when OnBuildProgramUnits is used

    hashtag
    Maintenance

    • Changed some RavenDBOptions properties to be only set once

    • Added comments for better code documentation

    hashtag
    May 2023

    hashtag
    New Features

    hashtag
    Translation Service

    • Added MicrosoftTranslatorService.BaseAddress

    • Make sure new language is added in correct sorted position

    hashtag
    Report Access Control

    • Added MinimumReportAccessLevel config

    • Better control over report access

    hashtag
    Hooks

    • Added RepositoryVerboseLogStore.EntryStored hook

    • Added Advanced.OnImpersonate hook

    hashtag
    Fixes

    • Fixed ExportToCsv functionality

    • Missing ExecuteMethodOperation.OpenUrl

    • Use correct typehint for Web3 colors

    hashtag
    Maintenance

    • Also detect [KeyValueList] on nullable enum

    • Updated packages

    hashtag
    April 2023

    hashtag
    New Features

    hashtag
    QR Code Generation

    • Added IQRCodeGenerator interface

    • Added basic BmpEncoder for QR codes for non-Windows platforms

    hashtag
    Task Extensions

    • Added TaskExtensions.FireAndForget for async operations

    hashtag
    Fixes

    • Fixed Web3 issue overwriting UserSettings

    hashtag
    Maintenance

    • Keep required rules for new POAWR

    • Keep max visibility for query types

    • Added Icon

    • Don't check for POActions´2 as base class

    hashtag
    March 2023

    hashtag
    New Features

    hashtag
    Extra Assembly Support

    • Added support for discovering types in extra assemblies (#357, #358)

    hashtag
    Performance

    • Performance improvement to ClaimSet Add

    hashtag
    Fixes

    • Allow UseAuthorization to be called inside UseVidyano

    • Allow custom suffix for split value objects

    • Make sure EntityType is set on POAWR.Lookup.PO

    hashtag
    Maintenance

    • EFCore: Enable AsNoTracking and ignore detached lazy loading warning

    • Fallback exception logger to ILogger on anything but Windows

    • Set correct TargetContextActionsType

    hashtag
    February 2023

    hashtag
    New Features

    hashtag
    Configuration Enhancements

    • More IVidyanoConfiguration comments

    • Changed EnableJobs to be enabled by default

    hashtag
    TypeCache Service

    • Exposed TypeCacheService for type management

    hashtag
    Query Features

    • Added DistinctValuesArgs.IncludeNullIfNullable

    • Better null handling in queries

    hashtag
    Fixes

    • Fixed issue with VAT as label

    • Fixed index out of range exception

    • Don't fail when trying to open content for in-memory verbose log

    hashtag
    Maintenance

    • Prefer file scoped namespaces throughout codebase

    • Use NuGet package icons

    • Better default handling of WhereEntity

    hashtag
    January 2023

    hashtag
    New Features

    hashtag
    Query Type Support

    • Added QueryType for better query categorization

    • QueryType fixes and improvements

    hashtag
    Advanced Features

    • Added Advanced.CorrectionOffset

    • More calls to ApplyDataSecurity when needed

    hashtag
    Datadog Integration

    • Added EnableDatadog ClientOperation

    • Better monitoring support

    hashtag
    Rich Custom Logs

    • Added UseRichCustomLogs

    • Enhanced logging capabilities

    hashtag
    Fixes

    • Fixed issue with GroupBy not working on interfaces (RavenDB)

    • Fixed KeyValueList on QueryType only, and KeyValueList on read denied

    • Fixed reference files

    hashtag
    Maintenance

    • Show attribute visibility during synchronize (query vs read+new)

    • Set account before starting verbose log threads

    • Verify against UtcNow


    Note: Commits marked with (test) or [skip ci] have been excluded from this changelog as they are internal testing commits.

    Changelog 2015

    hashtag
    December 2015

    hashtag
    New Features

    public sealed class MyCRMAdvanced : Advanced
    {
        public MyCRMAdvanced()
        {
            InstantSearchDelay = TimeSpan.FromMilliseconds(200d);
        }
    
        public override TimeSpan? GetInstantSearchDelayForUser(IUser user)
        {
            if (user.IsMemberOf("CantUseInstantSearch"))
                return null;
    
            // Fallback to default
            return base.GetInstantSearchDelayForUser(user);
        }
    
        public override void HandleInstantSearch(InstantSearchArgs args)
        {
            args.MaxResults = 12; // Defaults to 15 results
    
            var user = Manager.Current.User;
            if (user.IsMemberOf("Administrators"))
            {
                // Some built-in searches specific for application admins
                args.AddPersistentObjects();
                args.AddUsers();
            }
    
            using (var context = new MyCRMEntityModelContainer())
            {
                var search = args.Search; // The search query from the end user
    
                // The first parameter specifies the PO type name
                args.AddRange("Customer", context.Customers
                    .Where(it => it.FirstName.Contains(search) || it.LastName.Contains(search))
                    .Select(it => new
                    {
                        ID = it.CustomerID,
                        it.FirstName,
                        it.LastName
                    })
                    .Take(4)
                    .AsEnumerable()
                    .Select(it => new InstantResult(it.ID.ToServiceString(), it.FirstName + " " + it.LastName)));
                // The instant result determines the ObjectId and Breadcrumb to display the result in the menu
    
                // For single property lookups we have an easy helper method
                args.AddRange("Product", context.Products, it => it.ProductID, it => it.Name, 4); // 4 max results instead of the default 5
                args.AddRange("ProductCategory", context.ProductCategories, it => it.ProductCategoryID, it => it.Name, 4);
    
                int number;
                if (int.TryParse(search, out number)) // We can skip certain tables if the search input doesn't match the expected input
                {
                    args.AddRange("SalesOrderHeader", context.SalesOrderHeaders
                        .Where(it => it.SalesOrderNumber.Contains(search))
                        .Select(it => new
                        {
                            ID = it.SalesOrderID,
                            it.SalesOrderNumber
                        })
                        .Take(4)
                        .AsEnumerable()
                        .Select(it => new InstantResult(it.ID.ToServiceString(), it.SalesOrderNumber, it.SalesOrderNumber.IndexOf(search, StringComparison.OrdinalIgnoreCase) - 2)));
                    // The SalesOrderNumber column is a computed column ("SO" + ID) so we decrement the score by 2 for better ranking results
                }
            }
        }
    }
    Nullability improvements for Advanced
  • Improved IsEfQuery detection

  • Cache SmtpConfiguration KeyValueList

  • RavenDB: Updated client package

  • RavenDB: Show log expiration information

  • RavenDB: LookupReference handling

  • Enable XML documentation generation

  • Nullability improvements

  • POA nullability

  • Fixed missing property for translations
  • RavenDB: Fixed profiler issue

  • Don't sort value objects

  • Reduce need for internal access for providers
  • RavenDB: PersistentObjectActionsReference in package

  • RavenDB: Use correct PackagePath for POAReference file

  • RavenDB: Prefer PersistChanges over Context.SaveChanges directly

  • Profiler improvements and parameter serialization tweaks

  • Fixed issue when ExecuteAction gets a form submit without extra files
  • Fixed issue with AppInitialization

  • Fixed obfuscation issue with nullable annotations

  • Fixed issue with business rules with arguments not being invoked

  • RavenDB: Fixed OptimizeSelect issue when working with Reduce index

  • RavenDB: Handle ColumnReferenceEntity with empty id

  • Improved logging OneTimeJobHost/RepeatingJobHost
  • Web2Cdn: Tweaks for cdn2

  • Web2Cdn: Don't append / to appsettings.json Web2Version

  • RavenDB: Updated RavenDB.Client package

  • RavenDB: Minimize database calls when user doesn't have UserSettings

  • RavenDB: Handle IEnumerable property text search

  • Return SystemLanguage for DefaultLanguage if cache is not loaded

  • Don't use app.UseHttpsRedirection()

  • Show better message for repository upgrade
  • Tweaked assembly version handling

  • WebControllerLogger, default RequestId, fixed hour offset mismatch

  • RepeatingJob, fixed wait time and timezone handling

  • Improve GetObjectSet for RavenDB inheritance

  • Handle embedded ValueObject collection

  • PO type selection for ValueType collections

  • Comment, nullable annotations

  • RavenDB: Added DatabaseSettings.UseGuidIdentifiers

  • RavenDB: Project helpers
    RavenDB: Added RavenDBOptions.EnsureDatabaseExists
  • Disable cacheupdate setting

  • Don't require Mapped attribute for context entities

  • Prefer EntityModel.GetHash()

  • Handle Enum and IgnoreProperty

  • Set IsValueObject on PO

  • ITargetContext shouldn't be IDisposable

  • Update cache after successful savechanges

  • Implement RavenDB cache updates (#277, #278)

  • Default New User in management to IsEnabled

  • RavenDB: Extra extension methods

  • Prefer StatusCodes over HttpStatusCode

  • RavenDB: Updated client version
    Fixed Except on DbSet
  • Fixed issue when changing Setting Description

  • RavenDB: Fixed Log User

  • RavenDB: Fixed updatable log

  • RavenDB: Fixed feedback screenshot showing

  • RavenDB: Fixed issue with DistinctValues

  • Fixed issue with not being able to save QueryFilters

  • RavenDB: Fixed sorting and filtering on reference attribute

  • Fixed report documentation URL

  • Provide hook for non-Windows IsValidImage validation

  • RavenDB: Also delete profile/settings when deleting user

  • Async OneTimeJob

  • Prefer HttpMethods over HttpMethod

  • IFeedbackDto removed unused Screenshot property

  • TODO cleanup

  • Moved all DbSets from VidyanoDbContext
  • Added IRepositorySettingStore

  • Fixed Parameterize obfuscation issues
  • Fixed redirect issue when going to website path without trailing slash

  • Fixed setting profile value when no profile exists

  • Fixed incorrect use of IServiceProvider for ActivatorUtilities

  • Fixed bulk edit on POA

  • Fixed projection issues

  • RavenDB: Fix log filtering

  • Fixed issue with serialization of DataTypeHints

  • RavenDB: Handle references

  • Added DelayedCount support

  • Added ProviderSpecificService.GetEntityByObjectId

  • Allow start from empty model.json/culture.json/security.json

  • Persist culture.json/security.json when empty

  • Added NoDB UserSettings/UserProfiles

  • Also delete usergroups when removing user

  • Move GetTotalItem to ProviderSpecificService

  • EFcore: Parse issue with logging parameters

  • Use AsyncLocal fields instead of CallContext

  • RavenDB: Correctly flag as needsSimplifiedExpression

  • RavenDB: Ignore projected fields for GetTotalItem

  • RavenDB: Include DB profiling

  • Fixed TypeHint serialization

  • RavenDB: Moved database to production server

  • RavenDB: Handle GetGroupingInfo/GetTotalItem

  • RavenDB: Don't optimize projections

  • RavenDB: Fixed issue when using reference attribute with other PO type

  • RavenDB: RegisteredStream

  • Fixed issue with OnGetStream

  • Removed old Web1 binding

  • Fixed issue with initial run not loading data types correctly

  • Updated SwaggerInfoAttribute

  • Tweaked handling of AsDetail value objects

  • Nullability tweaks

  • RavenDB: Added Orders/OrderLines

  • LogVerbose tweaks
  • WIP RavenDB implementation

  • WIP VidyanoCultureContext

  • Moved culture related queries from VidyanoDbContext

  • WIP settings

  • First run db initialization efcore

  • WIP interface DTO

  • Moved extra custom queries

  • Small bugfixes

  • Moved logic to VidyanoModelContext

  • Unix timezone mapping

  • Removed Advanced.SingleInstance, UpdateCacheFromDatabase

  • WIP added IProviderSpecificService

  • Timezone fix

  • Removed NativeOnly

  • Removed SemanticZoom

  • Renamed IXXProvider to IXXStore

  • Made repository projects default nullable

  • Removed obsolete Effort related code/files

  • WIP Sample NoDB project

  • WIP VidyanoDbContext cleanup

  • Fixed sample NoDB project

  • WIP IRepositorySettingStore

  • Removed Settings from VidyanoDbContext/NoDatabase

  • Breaking change Vidyano.Logs

  • RavenDB: Explicit id determiner

  • Fixed issue with SetComputedAttribute not working when using proxy entities
    GetLabel tweaks for better label handling
    Fixed issue with Azure verbose logs not supporting viAudit syntax
  • Fixed issue with Web3 not triggering Manager.Initialize correctly

  • MultiString and IsEmail tweaks
  • ServiceLocator changes

  • Improved Web3 detection

  • Only filter on SortExpression if it has the same property type
    RequestScopeProvider is a singleton
  • TypeCache lazy should use PublicationOnly instead of None

  • Scoped cache for SQL user store

  • Don't save security.json on startup when creating database users/groups

  • Updated packages

  • Shorten ImpersonateMessage message

  • Word added extra helpers

  • Tweaked NewUserArgs to use fixed Id for new user

  • PO Advanced expose Metadata
    Updated packages
  • Optimize use cache

  • Prefer none lazy thread safety mode

  • Allow changed attribute names directly for UpdateCalculated
  • Updated packages

  • Datadog: Added Heartbeat, extended hooks (breaking change)

  • RavenDB: Always set obj.ObjectId after storing in context
    Performance fix Manager.GetTranslatedMessage without args
    Improved dialog options with default properties
    Fixed IgnoreProperty for Entity Framework Core
  • Improved disposal of ActionHandlers

  • Added NullUpdatableLog implementation
    Temporarily disabled TypeForwardedTo for obfuscator support
    Fixed handling of null RemoteIpAddress in GetClientIpAddress
    Let Poll also check that cache is loaded
    Keep SQL CacheUpdates backwards compatible
  • Updated packages

  • Updated packages
  • TODOs and code cleanup

  • Small tweaks and TODOs
  • Updated packages

  • Fixed issue with Api method not correctly logging exceptions
  • Fixed NRE inside SetValueFromObject

  • Fixed issue with Web3 not being detected from custom pages

  • Updated Web3
  • Updated packages

  • Bump copyright year

  • Make sure POA.Id stays in sync with name change
  • Skip custom queries for wrong entity type

  • Datadog sometimes failed when getting HttpRequest information

  • Added signedPermissions on GetSharedAccessSignatureUrlForBlob
    hashtag
    Geography Data Type
    • Added Geography data type

    • Added DbGeography support

    • Better spatial data handling

    hashtag
    User Settings Customization

    • Added ability to show custom attributes on User Settings page

    • Default translations logic for "en" based languages

    hashtag
    Advanced Hooks

    • Added CheckPasswordComplexity hook

    • Added ConstructUserSettings to simplify rules checking

    hashtag
    DataType Enhancements

    • Added DataType.CanSort/CanListDistincts

    • Use deterministic GUIDs for POs/POAs

    hashtag
    Fixes

    • Fixed issue with Export to excel being broken by Web2

    • Fixed binary file issues

    • Fixed issue with DbGeography failing on invalid input

    hashtag
    Maintenance

    • .NET 4.6.1 detection

    • Updated NuGet dependencies

    • Renamed POA.ListDistincts to CanListDistincts

    • Web2: Added reorder for PO.Queries and PU.Items

    • Fixed issue with renaming groups

    • Reorder handles duplicate offsets

    • Performance call shows unknown for empty query IDs

    • Show more attributes of PO on PO query

    • Don't show repository is out of sync message when cache is read only

    • Added FlagsEnum filtering

    • Removed custom user right resource data type

    • Improved License handling on Web2

    • Pass original exception when getting distinct values

    hashtag
    November 2015

    hashtag
    New Features

    hashtag
    Query Filters

    • Added ability to include filters from other users

    • Simplified DistinctValues to use 2 calls (matching and remaining)

    hashtag
    Notifications

    • Added NotificationType.Warning for Vidyano.Core PCL

    hashtag
    Fixes

    • Fixed issue when SqlException is thrown during ManagerImplementation.Initialize

    • Fixed issue when security.json contains renamed Group

    • Fixed issue with QueryFilter saving having user id in objectId

    hashtag
    Maintenance

    • Give more useful error when the model.json has an invalid Query

    • Removed unneeded db call for remaining distinct values

    • Don't assume PageSize 0 for arrays as source

    • Added text search support for Enum

    • Use SqlAzureExecutionStrategy instead of custom Retry logic

    • Fixed initialize issue for new projects

    • Added OnBuildProgramUnits hook to customize PUs/PUIs

    • Include extra information when ReportService throws an exception

    • Only use logic from SqlAzureExecutionStrategy (skip transaction check)

    • Split DisableSort in CanSort/CanFilter/ListDistincts

    • Core: Added PersistentObjectAttributeAsDetail

    hashtag
    October 2015

    hashtag
    New Features

    hashtag
    Advanced Hooks

    • Added Advanced hooks for exception message generation

    • Handles SQL error 547, 2601 and 2627

    • Includes SQL error for easy diagnostics

    • Added ability to use SQLXXXX messages for SQL errors

    • Added hook to customize new POAs

    hashtag
    Effort Support

    • Added Effort code for in-memory testing

    • Use Persistent Effort connection for in-memory changes

    hashtag
    Fixes

    • Fixed threading issue when updating enabledForType cache

    • Fixed issue with ExportToExcel failing on 0x00 characters

    • Fixed bulk edit on User

    • Fixed issue with synchronize adding 2 empty groups/tabs

    • Fixed NullReferenceException in Api calls when using tests

    hashtag
    Maintenance

    • Web2: Show POA Column/ColumnSpan

    • Added helper method to handle OnReorder

    • Use targetContext for looking up constraint columns

    • Include better message when numeric filtering fails because of invalid DataType

    • Bug fixes for Vidyano 4.6

    • Fix column span when opening attribute in management

    • Expose GetLabel helper method

    • Expose POAWR information for Advanced CreatePersistentObjectAttribute hook

    • Hide stack trace information when automatically activating license

    • Added validation for uniqueness of Group/Tab Name

    • Made QueryColumn.Label settable

    • Added some extra checks to ensure translations work with string.Empty instead of null

    • Generate correct project even if NuGet package creation fails

    • Forgot to add system settings when first creating repository

    • Use InnerException for TargetInvocationException

    • Updated Builder to use Package Source

    • Disable Profiler completely if Vidyano.DisableProfiler is set

    • Removed unused IL emit code from Profiler

    • Throw ObjectDisposedException instead of NullReferenceException on VidyanoDbCommand

    • Remove offset column for web version 2

    • Add fake persistent object on reorder query action result

    hashtag
    September 2015

    hashtag
    New Features

    hashtag
    Query Handling

    • Handle exclusions for query.AllSelected

    • Don't use meta refresh for initializing page

    hashtag
    Fixes

    • Fixed issue when fixing datetimeoffset comparison

    • Fixed issue with AsDetail not respecting detail PO's IsReadOnly

    • Fixed issue with refresh query when you have multiple objects of the same type

    hashtag
    Maintenance

    • Include application groups in security.json

    • Fixed issue with DataFilter not working on POA's DataType

    • Added accept hint when importing patches

    • Make sure we handle AddReference AllSelected as lookup

    • Allow reorder

    • Send DataTypeHints with lowercase keys

    • Always try default sorting if we couldn't sort on unmapped property

    • Moved CanReorder flag to correct Attributes query

    • Skip all tried sort options when sort goes wrong (unmapped property)

    • Fixed issue with changed TriggersRefresh not being remembered on round-trip

    • Allow changing of label on POA

    • Fall back to key for CouldNotDelete message if breadcrumb is empty

    • Added option to get EnvironmentVersion from Manager

    • Removed Obsolete properties from Manager

    • Correctly dispose mail clients that we create

    hashtag
    August 2015

    hashtag
    New Features

    hashtag
    Authentication

    • Added WebController.GenerateAuthToken method

    • Improved object tampering detection in debug

    hashtag
    Diagnostics

    • Include AppSettings in /Diagnostics

    • Show unhandled exception for diagnostics

    hashtag
    Licensing

    • Log activations (manual/from code)

    • Inform when activation failed

    • Handle concurrency exception when saving license

    • Include License in model.json

    • Include Vidyano version when logging exceptions

    hashtag
    Fixes

    • Fixed an issue where calling VerifyData in the license manager throws an ambiguous match exception

    • Fixed issue with Feedback

    • Fixed NRE in diagnostics

    • Fixed login page after logout

    hashtag
    Maintenance

    • Added hook to overwrite display value for POAWR

    • Log simpler stack trace for activation

    • Updated CommonMark/Newtonsoft.Json/Microsoft.WindowsAzure.Storage packages

    • Always hide potential passwords/keys

    • Use different dbcontext for verbose log writer/reader

    • Make sure we pass correct context to vidyano PO actions

    • Always include attribute id in securitytoken

    hashtag
    July 2015

    hashtag
    New Features

    hashtag
    Query Filters

    • Added watcher for App_Data *.json files

    • Prefer ./App_Data/ for non web environment

    hashtag
    User Experience

    • Added ClientOperation to reload page after changing UserSetting's Language/Culture

    • Added ability to define Vidyano.DiagnosticsToken app setting for Diagnostics

    • Include client information when submitting Feedback

    hashtag
    Data Types

    • Web: Added BigNumber to handle Int64/UInt64/Single/Double/Decimal

    hashtag
    Fixes

    • Fixed issue with synchronize adding reference attributes with visibility Never

    • Fixed issue with groups being lazy loaded not being locked

    • Fixed issue with missing TranslatedString/FlagsEnum in Attribute's Type

    • Fixed NRE issue in ParameterVisitor when static property was used

    • Fixed query filters issue

    hashtag
    Maintenance

    • Added fuzzy match for decimal types

    • Give small DEV notification if menu option is wrong

    • Fixed column offset sorting to use attribute's offset when null

    • Keep IsReadOnly consistent on AsDetail attribute

    • Don't cache all related user's groups during CreateCache

    • Correctly track IsChanged on UserGroupsArgs

    • Changed UserSettings message

    • Improved service behavior when username and authtoken are null

    • Disable filtering on LogVerbose columns

    • Added PersistentObject.IsReferential to indicate Reference/Lookup data

    • Fixed validation issue on Feedback

    hashtag
    June 2015

    hashtag
    New Features

    hashtag
    AsDetail Data Type

    • Moved AsDetail to own DataType instead of mis-using WithReference

    • Added migration for AsDetail attributes

    • Include ModelHash/SeederHash in model.json

    hashtag
    Query Filters

    • Handle Query filters differently for Web2

    • Added some client messages

    hashtag
    Fixes

    • Fixed issue when changing Session Persistent Object

    • Fixed issue with action name cache not being updated

    • Fixed InvalidCastException when label/description is null

    • Fixed issue with verbose logging not logging GetQuery QueryId

    • Fixed empty icons and unexisting query column mapping in Vidyano.Upgrade

    • Fixed schema synchronize issue if AsDetail data type doesn't exist yet

    • Fixed issue with bulkedit not working on user rights

    • Fixed issue when query.Columns is null in model.json

    • Fixed issue with query filters for Web2

    hashtag
    Maintenance

    • Removed obsolete GroupsInfo (not used by clients)

    • Fixed tabs info caching issue

    • Added close client message

    • Handle breaking change introduced with new repository system

    • Use ContentDisposition.FileName in favor of ContentDisposition.Name for binary file uploads

    • Handle more breaking changes introduced with new repository system

    • Fixed issue with QueueQueryRefresh not doing anything for queries that had count included in parent

    • Added some default user rights for EnvironmentVersion 2

    • Hint client to refresh query on completed for AddReference action

    • Made sure that query's PO is correctly during ExecuteQuery

    • Don't save security.json from Builder if nothing changed

    • Added indication if changes can currently by made with the Builder

    • Fixed issue with missing q.PersistentObject.Queries/Attributes on reference attributes

    • Ignore ThreadAbort exceptions in WebControllerLogger

    • Actually fix saving of changed Session persistent object

    • Web: Consistent behavior with Web2

    • Added helper method for build-in ExecuteMethod operations

    • Test: Added Refresh handling logic

    • Improved error when loading invalid model.json

    • Also hide Column/ColumnSpan/PostRender for Web2 on New Attribute/Query

    • No need to wait when password is empty on request without authttoken

    • Added the Required business rule to some of the system attribute's attributes

    • Added Required as client message

    • Detect invalid data (possible merge conflict) when loading model.json

    hashtag
    May 2015

    hashtag
    New Features

    hashtag
    Test Support

    • Added Test PO

    • Added most DataTypes

    • More data types

    hashtag
    System Actions

    • Added System actions

    • Added round-trip support for json repository

    • Include more information in PO.Tabs (Id, Name, Layout)

    hashtag
    Fixes

    • Fixed issue with running Vidyano outside of IIS (UnitTest)

    • Fixed templates order in model.json

    • Fixed reports not using random Id

    • Fixed data types not showing overridden templates

    • Fixed issue when creating new Data Type

    • Fixed issue with reading some Excel files

    • Fixed issue with not being able to add rights for Vidyano PO's

    hashtag
    Maintenance

    • Fixed labels not using user's language

    • Make sure DisableBulkEdit is set before OnConstruct

    • Make sure BulkEdit gets all selected items

    • Test: Service: Fixed threading issue on translatedProperties

    • Web: Only refresh queries that are active, otherwise schedule for search

    • Also check for TableAttribute (Code First) to see if entity is mapped

    • Expose Query.DisableBulkEdit

    • Ignore queries without columns when removing attribute

    • Use different message when unmapped property is used for textsearch

    • Web: Fixed issues with OpenAsDialog

    • Service: Fixed issue with QueryResultItem value for TranslatedString

    • Web: Fixed issue with nvtooltip staying after navigation

    • Web: Fixed issue with Date.format not supporting YearMonthFormat

    • Service: Fixed compatibility issue with Windows 10 build 10130

    • Service: renamed Find extension method to FindByObjectId

    • Fixed issue with using relative path on non-IIS environment

    • Added ClearFilterFrom client message

    • Implemented vi-breadcrumb search mode

    • Added option to dump Verbose logs to SQL server

    • Create logging table on startup

    • Disable migrations

    • Added translatable label and description to Acs/Vidyano provider

    • Fixed object tampering on readonly reference attribute value of lookup PO

    hashtag
    April 2015

    hashtag
    New Features

    hashtag
    JSON Repository

    • Load from json based repository

    • Consistent model.json saving

    • Added basic implementation of runtime patches

    • Disable more actions when read-only

    • Handle user/group creation in recording mode

    • Added patch recording for removing from group

    hashtag
    Google Places

    • Added Google Places lookup

    hashtag
    Upgrade Tool

    • Added Vidyano.Upgrade project

    • Fixed issue with viSearch

    • Fixed issue with labels having rule Required instead of NotEmpty

    hashtag
    Fixes

    • Fixed labels

    • Fixed translated string handling

    • Fixed loading of admin rights

    • Fixed loading of management objects

    • Fixed system reference data missing keys

    • Fixed columns being fixed size

    • Fixed system labels issues

    • Fixed issue when parent was needed in Management

    • Fixed refresh translations

    • Fixed add/remove language

    • Fixed remove Schema/PO/POA/Query/Template

    • Fixed some NRE issues

    • Fixed PO Rights query

    • Fixed RepositorySynchronizer

    • Fixed issue when saving existing UserRight

    • Fixed builder

    • Fixed synchronize issue

    • Fixed issue with POAWR.LookupId not being set

    • Fixed issue with Administrators not being member of Users for new project

    • Fixed issue with running Vidyano outside of IIS (UnitTest)

    hashtag
    Maintenance

    • Handle SaveNew/SaveExisting UserRight/Message

    • Removed non-EN translations from SystemModel

    • Web: Reverted change on ServiceAction.Icon

    • Removed old/obsolete TODOs

    • Remove user rights when user is removed

    • Show Group.Name/Tab.Name attributes

    • Handle OnSelectReference in ModelPOActions

    • Handle queries (SaveNew, Add, Remove, Delete)

    • Fixed issue with saving PO

    • Fixed NRE for ExportToExcel

    • Consistency update from upgrade process (JObject are sorted by key)

    • Added watcher for Icons

    • Partial builder implementation

    • Added cache for rights by user

    • Removed obsolete code from TranslatedStringEx

    • Create json data for empty repository

    • Added checks for RepositorySchemaSynchronizer

    • Fixed NRE with Charts

    • Removed unneeded usages of PO/Query.IsSystem

    • Increased BCrypt default complexity to 12

    • Cleaned up system messages

    • Removed unneeded TODO's

    • Handle system icons

    • Fixed issue when selecting PO on Query

    • Fixed more builder logic

    • Show paths for icons

    • Fixed issue with PUI.Icon

    • Fixed issue with creating new PUI

    • Use Query.Label when creating new PUI for Query

    • Show message if UserRights contain unknown User Ids

    • Made new User.Password optional

    • Fixed VS Builder

    • Fixed Synchronization issues

    • Allow .svg as icon

    • Fixed new project creation

    • Fixed some more builder issues

    • Enabled Code First on new project

    • Disabled Windows Store related code

    • Fixed issue with syncing repository

    • Updated Upgrade tool

    • Fixed issue with messages being case-sensitive

    • Fixed issue with missing user

    • Fixed issue when opening QueryColumn

    • Fixed issue in SystemModel

    • Write trace message when ReferenceResolver can't resolve reference

    • Use Model.GetEntity when possible

    • Added Manager.ExecuteAction

    • Fixed issue when synchronizing new DataType

    • Removed filterName argument

    • Fixed synchronization issue

    • Ensure SystemReferenceData always uses IsSystem

    • Fixed issue with refreshing translations

    • Fixed issue in google maps postRender call

    • Only re-order culture dictionaries on add

    • Show Message.IsSystem

    • Fixed issue with UserRight missing Vidyano schema

    • Added option to include groups for User/NullableUser data type

    • Fixed issue with column order being invalid

    • Handle Important UserRight

    • Made service-side JavaScript opt-in (CustomAction, BusinessRule, POAction)

    • Fixed Action saving

    • Fixed Help saving

    • Only flush .json files after all patches are applied and DB saved

    • Fixed issue with PO WebCode not being saved

    • Updated NuGet packages

    • Ensure cache dictionaries stay case-insensitive

    • Prefer empty group/tab for new attributes

    • Gzip embedded resources

    • Added PersistentObject.NewBreadcrumb

    • Updated html2canvas

    hashtag
    March 2015

    hashtag
    New Features

    hashtag
    Google Places

    • Added Google Places lookup

    hashtag
    VS2015 Support

    • VS2015 specific changes

    • Changed IsEmail rule to allow multiple entries

    hashtag
    Fixes

    • Fixed issue when searching for today on DateTimeOffset

    • Fixed issue when searching decimal value on float/double

    • Fixed synchronizing issue when switching between POA/POAWR

    hashtag
    Maintenance

    • .NET 4.5 related code clean-up (#if/async/...)

    • Skip obfuscation for POActions

    • No longer log assemblies in ExceptionService

    • Added Manager.GetSetting/Manager.SetSetting(string, object)

    • Removed some EditorBrowsableState.Never attributes

    • Web: Fixed issue for Save hook when calling completor without arguments

    • Web: Fixed issue with options not working correctly for MultiChart

    • Performance optimization when text search doesn't contain quotes

    • Also allow delay for Query RefreshOperation

    • Fixed issue when Vidyano user is renamed

    • Fixed issue with Query RefreshOperation triggering multiple times when searching manually

    • Auto-refresh logs every 5 minutes

    • Updated EntityFramework to 6.1.3

    hashtag
    February 2015

    hashtag
    New Features

    hashtag
    Client Operations

    • Added ability to send additional operations that should be executed clientside

    • Added OpenOperation (opens specified PersistentObject as if it was launched from an action)

    • Added ExecuteMethod "showMessageBox" client operation

    hashtag
    Windows Authentication

    • Added support for Windows Authentication

    • Use Request.LogonUserIdentity instead of WindowsIdentity.GetCurrent

    hashtag
    Fixes

    • Fixed issue with ReadAsExcelSheet failing with empty cells

    • Fixed typo in initialize sql

    • Model SQL requires GO instead of go

    • Fixed synchronize issue with inherited types on EF6

    • Fixed issue with dialog PersistentObject and POAWR with CanAdd

    hashtag
    Maintenance

    • Handle OnPreviewLoad in Manager.GetPersistentObject

    • Web: Improved handling of WindowsAuthentication

    • Add default ReadEdit/Vidyano.Import right for all users to allow RegisterImport

    • Don't open PO result from ExecuteAction if HasError

    • Handle HasError as FaultException on Load/BulkEdit

    • Require explicit implementation of OnBulkConstruct to enable Bulk Edit

    • NuGet: Updated Newtonsoft.Json to 6.0.8

    • Web: Correctly handle OpenOperation of ExecuteMethodOperation "navigate" when saving IsNew PO

    • Web: Fixed issue with ServiceGateway.toServiceString

    • Change Api handler to be async

    • Fixed issue when creating new project

    • Fixed merge issue

    • NuGet: Updated nuspec file for Newtonsoft.Json

    • Updated embedded CommonMark package

    • Consistent behavior when calling GetQuery WebAPI with non-guid id

    • Fixed issue with text search replacing text inside quoted parts

    hashtag
    January 2015

    hashtag
    New Features

    hashtag
    Service Actions

    • Added ServiceAction.Confirmation

    • Small tweak to keep confirmation message IsClient

    hashtag
    Manager Settings

    • Added Manager.SetSetting

    • Added hook to determine user groups from code

    • Added option to specify extra options for Import

    hashtag
    Fixes

    • Fixed locking issue with AppDomain.OnAssemblyResolve

    • Fixed issue with filtering on DateTimeOffset

    • Fixed issue with LogRetention not correctly handling 0

    • Breaking change: Query menu items for which the user only has rights for 1 or more columns will now also show

    • Fixed small bulkedit issue

    • Fixed issue with Manager.GetPersistentObject being called outside Vidyano

    hashtag
    Maintenance

    • Expose Manager.TimeZone

    • Removed obsolete/outdated WPF related code

    • Ensure Vidyano is initialized/updated when using Api calls

    • Updated CommonMark.NET (0.6.0)

    • Updated EntityFramework (6.1.2)

    • Updated Newtonsoft.Json (6.0.7)

    • Use Task.Run instead of Task.Factory.StartNew

    • Use ThreadPool.QueueUserWorkItem instead of Task.Factory.StartNew

    • Updated Optimizer to allow Related.Related.Related.Property

    • Also allow Task as return type for Api method

    • Tweaked AsDetail attribute, correctly handle OnRefresh on client side

    • Combine OnSave with saves for details (in transaction)

    • Web: Fixed issue with SelectReference not triggering OnRefresh on AsDetail

    • Allow String to Enum as DataType (fixes EF6 issue)

    • Web: Fixed issue with browseReference onCompleted not being called

    • Web: Changed place where ExecuteMethod clientOperations are being checked to Vidyano.clientOperations

    • Added handling of Required/NotEmpty rule on AsDetail attribute

    • Fixed bug with BinaryFile inputs not being cleaned up

    • Web: Use delay for Open clientOperation

    • Web: Added ability to specify delay for "showMessageBox"


    Note: 2015 was a transformative year with 257 commits introducing the JSON-based repository system, moving away from database-only storage, adding Advanced hooks, implementing Google Places, adding support for VS2015, and major improvements to the Web2 client.

    5.40.2+2a48896

    Thursday, November 8th, 2018

    hashtag
    Features

    • Added Advanced.IsSettingValueValid method to allow checking of value for custom settings

    • Added PersistentObjectAttribute.SetValueWithRefresh method that will also call the OnRefresh code if needed

    • Added (Async)CustomAction.IsAllowed method

    • Added Manager.HasRepositoryConnection helper method to see if the repository database is available

    • Added PersistentObject.LoadingStrategy to determine how the entity should be loaded from the database

    • Added IQueryable.FilterByObjectId method to apply the correct Where filtering including data security

    • Added PersistentObjectAttribute.OptionalColumn to indicate that the column should not be shown by default

    • Added extra hooks for SAML 2.0 processing (DetermineSaml20Information and GenerateSaml20RedirectUrl)

    • Added viAudit feature that is avaiable for Administrators when verbose logging is enabled

    • Added Advanced.IsTrustedProxyIpAddress to allow X-Forwarded-For header for trusted proxy/load balancer/forwarded

    • Added WebsiteArgs.Redirect method to redirect the page load to another location (e.g. SSO portal)

    hashtag
    Changes

    • Swallow “Cannot access a disposed object” exception for System.Web.WebSockets.AspNetWebSocket

    • Persist changed attributes after unchanged to entity

    • Also profile CreateUserSession

    hashtag
    Fixes

    • Fixed issue on Diagnostics page when GenerateMessage would throw an exception (e.g. validation error)

    • Fixed issue with NullReferenceException when calling Manager.WebsiteRoot, will return null now instead

    • Fixed issue with new RepeatingJob not triggering

    Nuget Version
    Nuget Version
    Nuget Version
    Nuget Version

    5.34.3+d278982

    Monday, March 12th, 2018

    hashtag
    Features

    • Added Manager.LogEntry to get client version, user agent and requestId

    5.30.0+530afaf

    Sunday, December 28th, 2017

    hashtag
    Features

    • Added Advanced.StorageProvider to handle reading/writing of verbose log content ()

    Replace authToken in verbose logs with just the expiration info
  • Use Setting.DataType as configured in repository (i.e. for Password the content will be hidden)

  • Allow custom queries from base PersistentObjectActions class

  • Fixed issue in ReplaceSensitiveUrlPart when Url is empty

  • Fixed issue where data from removed columns in QueryExecuted were still being sent to the client

  • Fixed issue when saving a new DataType when the project doesn’t have templates in the model.json

  • Fixed issue where unique index violation would also list included columns from index

  • Added CustomApiController.OnPreApi hook and ApiArgs.CustomMethod property
  • Added Advanced.HandlePasswordOrTwoFactorChanged

  • Added support for Swagger definitions in arguments/responses

  • Support UserName/AuthToken in Authorization header for Vidyano default web calls

  • Added support for $select on reports to only return a limited set of columns

  • Added parameter user on Manager.Log to log for that specified user instead of current user

  • hashtag
    Changes

    • Validate actual password change for ResetPasswordNextLogin

    • Sort swagger tags/path alphabetically

    • Also handle signin/signout as reserved words

    • Increased pwnedpasswords api timeout to 10sec

    • Log AzureStorageConnector auto-resume logs as Warning

    • Log failed sign in attempt for existing users using user in log instead of username in message

    • Minimize timing attack against unknown users

    hashtag
    Fixes

    • Fixed issue when saving existing filter

    • Fixed issue when custom Api method resumes null instead of HttpResponseMessage

    • Fixed issue with nested repeated sections in Word.Generate

    • Fixed issue with exception handling in AzureStorageConnector

    Added extra logging in Verbose logs (User agent, Client version, Request id and 5 custom variables) (example)
  • Added basic support for being a SCIM 2 service provider (example)

  • Added authentication support for Azure AD Single Sign-On using SAML (example)

  • Added sync option for hidden attributes and detail queries

  • hashtag
    Changes

    • Updated EntityFramework NuGet dependency to 6.2.0

    • Changed newline endings back to CRLF for PersistentObjectActionsReference.cs

    hashtag
    Fixes

    • Fixed issue with AuthorizationSignature for reports not being checked correctly

    • Fixed issue with missing groups for users when enabling NoDatabase

    • Fixed issue when enabling or disabling verbose model

    example

    Security

    Client

    Web3 release notes

    Allow user registration

    On the Security page you can configure the PO that should be shown and the application group for the user rights. For most applications the Register PO will be a new virtual Persistent Object with at least an email address (username) and password attribute. The following code shows an example POActions class for the Register PO.

    public class RegisterActions : PersistentObjectActionsReference<AdventureWorksEntityContainer, object>
    {
        public override void OnSave(PersistentObject obj)
        {
            if (!CheckRules(obj))
                return;
    
            var userName = (string)obj["Email"];
            if (Manager.Current.GetUser(userName) != null)
                throw new FaultException("That user already exists. Use the forgot password functionality to reset your password.");
    
            Manager.Current.CreateNewUser(userName, (string)obj["Password"], profile: new Dictionary<string, string> { { "Registered", "self" } });
    
            obj.AddNotification("You can now login using your email and password.", NotificationType.OK);
        }
    }

    Forgot password

    When working with email addresses as user names we can use this information to provide a forgot password functionality. By implementing the HandleForgotPassword method on the Advanced class you'll get the "Forgot password?" button on the Sign in screen.

    Best practice recommends for generating a random reset password token (ObjectEx.GetSecureRandomPassword can be used), storing the token in the user profile, emailing the user a link that triggers an api method that will verify the token and user combination. At that moment you can use the IUser.ResetPasswordNextLogin() method to trigger a password change on next login and redirecting the user to an existing logged in session.

    // In [Schema]Advanced.cs
    public override void HandleForgotPassword(ForgotPasswordArgs args)
    {
        // NOTE: Always inform for success so that we don't leak information about users
        args.Notification = "An email has been sent with all the information to reset your password.";
    
        var user = Manager.Current.GetUser(args.UserName);
        if (user == null)
            return;
    
        var userHostAddress = Manager.Current.RequestMessage.GetClientIpAddress();
        var token = user.Profile["ResetPasswordToken"];
        if (string.IsNullOrEmpty(token))
        {
            token = ObjectEx.GetSecureRandomString(16).Replace("-", null).Replace("_", null);
            user.Profile.SetValue("ResetPasswordToken", token);
        }
    
        var location = Manager.Current.WebsiteRoot + $"api/ResetPassword?UserName={user.Name}&Token={token}";
        // TODO: Send email to user with information (password change requested, from ip, location to click, ...)
    }
    // In [Schema]Web.cs
    public IResult ResetPassword(ApiArgs args)
    {
        var userName = args.Query["UserName"];
        var token = args.Query["Token"];
        if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(token))
            return Results.Problem("Invalid request", statusCode: 400);
    
        var user = Manager.Current.GetUser(userName);
        if (user != null && token == user.Profile["ResetPasswordToken"])
        {
            user.Profile.SetValue("ResetPasswordToken", null); // NOTE: Resetting the token can be a problem if the user doesn't complete the change password prompt
            user.ResetPasswordNextLogin();
    
            var encodedUser = Convert.ToBase64String(Encoding.UTF8.GetBytes(user.Name)).Replace('/', '_');
            var authToken = WebController.GenerateAuthToken(user.Name, DateTimeOffset.Now.AddDays(28), Manager.Current.RequestMessage.GetClientIpAddress()).Replace('/', '_');
            var redirectUrl = Manager.Current.WebsiteRoot + "#!/SignInWithToken/" + encodedUser + "/" + authToken;
            return Results.Redirect(redirectUrl);
        }
    
        return Results.Problem("Invalid request", statusCode: 403);
    }

    5.25.3+8224b3b

    Tuesday, September 19th, 2017

    hashtag
    Features

    • Added extra per PO unique salt for securing the SecurityToken

    • Added support for using anonymous types in custom queries

    • Added default MinLength business rule

    • Added support for per query user rights to give user/group access to a single query instead of all queries of a persistent object

    • Added Manager.UpdatableLog method to get a Vidyano log entry that can be changed

    • Added Advanced.PreNewFeedback hook for adding extra attributes on New Feedback

    • Added PO/Query property to override label for specific action

    • Added Advanced.OnLogin hook to show extra PO to end-user before the application can be used

    • Added Report.Description for optional description

    • Added a Profile detail query on User to see the current profile values

    • Added caching of all Web2 CDN resources when a version is requested (can be disabled using the Vidyano.DisableWeb2CdnPreload appSetting)

    hashtag
    Changes

    • Made ObjectEx.GetSecureRandomString public

    • Made some changes to action based user right (new NewDelete combined right, grouped rights, …)

    • Made Report.Token optional, a report without token is disabled

    hashtag
    Fixes

    • Fixed issue with non-sliding auth token not working on ADFS via ACS

    • Fixed incompatibility issue with .NET standard System.Net.Http package when receiving large request

    • Better detection for mapped code first entities

    Best Practices

    hashtag
    Configuration Settings

    If your deployment allows for configuring settings outside of the source code (e.g. the Application Settings tab on Microsoft Azure App Services) then this can be used to configure a set of application settings that even the developers won't have access to.

    hashtag
    Security Tokens

    Critical: Replace all security tokens in production environments. The default tokens generated during development should never be used in production as they may be committed to source control.

    Replace the following tokens in your production configuration:

    • ApplicationSalt (via the Vidyano:ApplicationSalt app setting)

    • DiagnosticsToken (via the Vidyano:Diagnostics app setting)

    • ObjectIdsSalt (via the Vidyano:ObjectIdsSalt app setting)

    PowerShell Token Generator:

    Use this PowerShell snippet to generate secure random tokens matching Vidyano's token generation logic:

    This outputs JSON-formatted values ready to copy-paste into your configuration.

    hashtag
    Cookie-Based Authentication

    Recommended: Enable cookie-based authentication for enhanced security in web applications.

    By default, Vidyano stores authentication tokens in browser storage. For improved security, you can enable secure, HttpOnly cookies via the CookieBasedAuthentication setting:

    Benefits:

    • Authentication tokens stored in secure, HttpOnly cookies (not accessible via JavaScript)

    • Better protection against XSS attacks

    • Automatic cookie transmission with requests

    Compatibility notes:

    • Safe to enable for standard web applications

    • If your application calls Vidyano APIs directly (e.g., from external services), ensure your HTTP client library has cookie store support enabled

    • The Vidyano.Core NuGet package has this enabled by default since v5.53.0

    hashtag
    Other Configuration Settings

    • Use a different set of credentials/connection string for the database

    • If configured, use another connection string for verbose logging

    • Enable the Vidyano:ForceHttps app setting to enable HSTS

    hashtag
    Code Configuration

    hashtag
    Rate Limiting

    Enable rate limiting to protect against abuse and brute-force attacks. Rate limiting is disabled by default and can be enabled in your appsettings.json:

    This enables the default Moderate level with rate limit headers included. You can customize the level if needed:

    Available levels:

    Level
    Read/min
    Write/min
    Use Case

    The rate limiting feature includes:

    • User-based partitioning - Works in intranet environments without IP-based issues

    • Automatic 2FA token reuse prevention - Built-in protection against replay attacks

    • Read/Write classification - Different limits for read vs write operations

    hashtag
    Distributed Cache (Optional)

    Recent versions of Vidyano include automatic in-memory rate limiting and 2FA token validation. However, you may still want to add a distributed cache in these scenarios:

    • Multi-instance deployments - When your application runs across multiple instances, pods, or servers

    • Persistence across restarts - To maintain rate limit counters and 2FA validation state when the application restarts

    Redis Cache (Recommended for production):

    Install the NuGet package, then configure:

    SQL Server Cache:

    When IDistributedCache is registered, Vidyano will automatically use it for rate limiting and 2FA validation. Otherwise, it falls back to in-memory caching (per instance).

    hashtag
    Security Headers

    Add security headers to protect against common web vulnerabilities. The GetWebsiteContent method in your [Schema]Web class is called for the initial HTML page and is the ideal place to add security headers:

    Important: Review and adjust the Content-Security-Policy based on your application's specific needs. The example above is a starting point that may need to be relaxed for certain features.

    hashtag
    Automation protection

    If the web app is available on the public internet and can be accessed without logging in (e.g. contact form) you should provide extra protection against abuse. This can easily be done by using the Google reCaptcha library to validate the request.

    hashtag
    External Audit

    Vidyano has been externally audited by The Security Factory, you can read the report , , .

    “Overall Security Posture

    Based on our experience we would rate the security posture of the application in the higher regions of good security.”

    Changelog 2017

    hashtag
    December 2017

    hashtag
    New Features

    hashtag
    SCIM 2.0 & Azure AD SAML SSO

    • Implemented SCIM 2.0 Service Provider

    • Added Azure AD SAML SSO support

    • Enterprise identity management integration

    hashtag
    Reports Security

    • Added Report Access/Compromised tracking

    • Report security improvements

    • PowerShell examples for reports

    hashtag
    Fixes

    • Fixed issue #139

    • Fixed builder issue when vidyano project is inside solution folder

    • NoDatabase issue with security.json file with groups

    hashtag
    Maintenance

    • Added sync option for hidden attributes and detail queries

    • Changed default project web.config

    • Extended verbose logging

    hashtag
    November 2017

    hashtag
    New Features

    hashtag
    Advanced Hooks

    • Added Advanced ACS hook to passthrough a custom domain

    • Added hook to customize index.html for websites

    • Changed BlacklistedPasswords to IsPasswordBlacklisted

    hashtag
    User Management

    • Allow User/NullableUser data type for String property

    hashtag
    Fixes

    • Fixed issue #131

    • Fixed issue #103

    • Fixed issue with changes to custom settings not showing until restart

    hashtag
    Maintenance

    • Made POA.GroupName setter public

    • Added DEV indication for exception

    • Added application start time

    hashtag
    October 2017

    hashtag
    New Features

    hashtag
    User Management

    • Added IUser.IsEnabled/Enable()/Disable()

    • User enablement/disablement functionality

    hashtag
    Query Actions

    • Added QueryAction enum with built-in query actions

    • Better query action organization

    hashtag
    Fixes

    • Fixed issue #121

    • Fixed issue #122

    • Fixed issue #125 - Manager.DeleteUser

    • Fixed issue with ExecuteAction through form using 100% CPU in chrome

    hashtag
    Maintenance

    • Allow API/Instant request using default user

    • Excel changes

    • Added property order overrides for json serialization

    hashtag
    September 2017

    hashtag
    New Features

    hashtag
    Per-Query User Rights

    • Added support for per query user rights

    • Introduced Query.HasRight

    • Extended UserRightActions to support per query user rights

    hashtag
    IUpdatableLog (#105)

    • Added IUpdatableLog interface

    • Better log management

    hashtag
    Action Labels (#109)

    • Added PO/Query ActionLabels

    • Better action organization

    hashtag
    Anonymous Queries

    • Added support for anonymous queries

    • Made Report.Token optional

    hashtag
    Fixes

    • Fixed issue #99 - salted PO

    • Fixed issue #101 and #102

    • Fixed issue with signing in using ACS for non-sliding auth token (#97)

    hashtag
    Maintenance

    • Made email part of feedback async

    • Made request reading async/await

    • Added feedback hooks

    • Don't send Initial PO for default user

    hashtag
    August 2017

    hashtag
    New Features

    hashtag
    Security Enhancements

    • Security architecture documentation

    • Security audit overview

    • Changed security screen to be more compact

    hashtag
    Preview Loading

    • Added PreviewLoadArgs.HandleAsNew method

    • Better control over preview loading

    hashtag
    Fixes

    • Fixed issue #87

    • Fixed issue #89

    • Fixed issue #91

    • Fixed issue with DefaultPersistentObjectActions being used for Vidyano

    hashtag
    Maintenance

    • Handle NRE for #83 when no responses are defined

    • Detect ComplexType as mapped classes

    • Missing updated seeder hash

    hashtag
    July 2017

    hashtag
    New Features

    hashtag
    Password Security

    • Updated password recommendations

    • Better password handling

    hashtag
    Query Options

    • Added option to skip computing of total items

    • Better query performance

    hashtag
    Developer Actions

    • Added viDuplicate dev action

    hashtag
    Fixes

    • Fixed issue #33

    • Fixed issue #70

    • Fixed issue #72

    • Fixed issue #76

    hashtag
    Maintenance

    • Consistent handling of TargetInvocationException

    • Log unhandled api errors

    • Added remark for Advanced.HandleForgotPassword

    hashtag
    June 2017

    hashtag
    New Features

    hashtag
    Forgot Password & Registration

    • Added ability to define Register PO and handle Forgot password

    • Better user onboarding

    hashtag
    Detail Rules

    • Added CheckDetailRules for improved check rules on Detail attribute

    hashtag
    Fixes

    • Fixed issue #53

    • Fixed issue #66

    • Fixed issue #67

    • Fixed issue when adding language and no microsofttranslatorappid exists

    hashtag
    Maintenance

    • Changed .Legacy target framework to 4.5

    • C# 7 refactor throughout

    • Don't initialize PO ActionCodes/HelpSet to empty collection

    hashtag
    May 2017

    hashtag
    New Features

    hashtag
    API Methods

    • Allow Async suffix for api methods

    • Better async support

    hashtag
    Advanced Features

    • Added Advanced.HandleUnobservedTaskException method

    hashtag
    Azure Storage

    • Fixed AzureTableQuery issue in obfuscated builds

    hashtag
    Fixes

    • Fixed issue with IUser.Profile[] returning Settings data

    • Fixed issue when AutoQuery is enabled during OnConstruct(query, parent)

    • Fixed issue with Null JToken on ToServiceString

    hashtag
    Maintenance

    • Don't block application start when cleanup of CacheUpdates/Logs fails

    • Respect developer CanSort options for existing user sort options

    • C# 7 refactor

    hashtag
    April 2017

    hashtag
    New Features

    hashtag
    Azure Storage

    • Added AzureStorageAccount helper class

    • Use Azure storage REST API

    • Improved AzureStorageConnector

    hashtag
    Developer Actions

    • Added viRestartWebApp action

    • Added viRegenerateToken action

    hashtag
    Date Filters

    • Added LastXDays filter for dates

    • Better date filtering

    hashtag
    Fixes

    • Fixed issue #1

    • Fixed issue #24

    • Fixed issue #55

    • Fixed issue #56

    hashtag
    Maintenance

    • C# 7 refactor throughout

    • Improved performance when searching verbose logs on Created on

    • Removed obsolete Instant PO

    hashtag
    March 2017

    hashtag
    New Features

    hashtag
    Instant Search (#46)

    • Added instant search functionality

    • Added input validation for instant search methods

    hashtag
    Web2 CDN

    • Introduced local cache for Web2 CDN requests

    • Client version change notifications

    • Per website web2 version support

    hashtag
    API Features

    • Added ApiMethod.NeedsAuthentication

    • Allow Vidyano Setting overrides using AppSettings

    hashtag
    Fixes

    • Fixed issue with empty column for csv reports

    • Fixed issue with empty language value not being set if same as English

    • Fixed issue with some translations being incorrectly reused

    hashtag
    Maintenance

    • Added Advanced.Poll hook

    • Only check Web2Version setting if ManagerImplementation is Initialized

    • Removed tag for new web components

    hashtag
    February 2017

    hashtag
    New Features

    hashtag
    Export to CSV (#27)

    • Added CSV export functionality

    • Better data export options

    hashtag
    Advanced Features

    • Added Advanced.PostFeedback

    • Better feedback handling

    hashtag
    Fixes

    • Fixed issue #28

    • Fixed issue when using Manager.GetPersistentObject not passing correct ObjectId when changed

    • Fixed issue with exception in custom Web class constructor not being logged correctly

    hashtag
    Maintenance

    • Made IOffset public

    • Added release notes

    • Tweaked default .tsconfig

    • Fixed builder issues with new semantic versioning

    hashtag
    January 2017

    hashtag
    New Features

    hashtag
    User Management

    • Added Manager.GetUsersForGroup

    • Better group management

    hashtag
    PersistentObject Methods

    • Added PO.RemoveAttribute/AddQuery/RemoveQuery

    • More flexible PO manipulation

    hashtag
    ServiceAction

    • Added ServiceAction.KeepSelectionOnRefresh

    • Better UI state management

    hashtag
    Fixes

    • Fixed issue #23

    • Fixed issue when bulkediting POs

    • Fixed issue with bulkediting UserRights

    • Fixed issue with CreateTransactionScopeForAction not working with profiler

    hashtag
    Maintenance

    • Changed TargetFramework to 4.5.2 (then back to 4.5)

    • Use NuGet for DocumentFormat.OpenXml (#19)

    • Missing translations


    Note: 2017 was a massive year with 400 commits focusing on C# 7 refactoring, security enhancements, SCIM 2.0 implementation, instant search, Web2 CDN improvements, and numerous performance optimizations.

    Changelog 2016

    hashtag
    December 2016

    hashtag
    New Features

    hashtag
    OAuth Provider

    • Exposed OAuthProvider (#15)

    • Better OAuth integration

    hashtag
    Fixes

    • Fixed bulk-edit not working on User (#12)

    • Fixed NRE when saving existing group

    • Fixed issue with Excel rows using 1-based index

    hashtag
    Security

    • Increased entropy for new report token

    • Don't send HSTS header when running on localhost

    hashtag
    Maintenance

    • Translations improvements (#17)

    • Made route suffixes opt-in

    • Don't log ThreadAbortException/TaskCanceledException in ExecuteAsync

    hashtag
    November 2016

    hashtag
    New Features

    hashtag
    Transactional Logic

    • Added transactional logic (opt-in)

    • Added POActions.OnBulkSave

    • BREAKING: Removed default code from OnRefresh

    hashtag
    Builder Updates

    • Updated solution to VS2017 RC (15.0)

    • Use Web² by default

    • Changed default Web template to include recommended options in web.config

    hashtag
    Fixes

    • Fixed issue with PU Items not being sorted when added using AddQueriesToProgramUnit action

    • Fixed issue when creating new project

    hashtag
    Maintenance

    • Also send referrer to CDN for web2 requests

    • Extra information when logging

    • Fixed issue with UpdateVidyanoVersion.exe

    hashtag
    October 2016

    hashtag
    New Features

    hashtag
    Verbose Model JSON

    • Added ability to save/load verbose model.json

    • FileSystemWatcher for model changes

    • Session support for verbose model

    hashtag
    User Management

    • Added ability to rename user from code

    • Fixed cache invalidation

    • User rename tweaks

    hashtag
    Fixes

    • Fixed issue when synchronize needed to add new settings

    • Fixed NRE when display attribute of POAWR does not exist as property

    • Fixed issue with detail attributes being created together with their parent

    hashtag
    Maintenance

    • Advanced: Added ability to change or disable IP used for auth token

    • Always prefer using the request uri with correct schema (X-Forwarded-Proto)

    • Keep current DisplayAttribute on POAWR when changing lookup and it exists

    hashtag
    September 2016

    hashtag
    New Features

    hashtag
    Swagger API Definition

    • Added option to define swagger api definition

    • Added SwaggerContactAttribute

    • Allow defining of response type

    hashtag
    Dialog Actions

    • Added new Action.ShowedOn option Dialog

    • Show custom action in a Persistent Object Dialog

    hashtag
    API Extensions

    • Extended API to support commonly used cases (versioning, authorization, paths)

    hashtag
    Fixes

    • Fixed issue with two factor login

    • Fixed issue with IsWord rule showing wrong message

    • Fixed issue when renaming PO

    hashtag
    Maintenance

    • Build Vidyano.Core as NuGet package

    • Allow native navigation for websites

    • Fix common model.json merge issues

    hashtag
    August 2016

    hashtag
    New Features

    hashtag
    Two-Factor Authentication (2FA)

    • Implement basic 2FA checker

    • Store two-factor token in user table

    • QR code generation for 2FA

    • Show code label on sign-in page

    hashtag
    Fixes

    • Fixed issue with new dates that aren't visible

    • Fixed issue when filtering on null

    • Fixed unknown NRE issue

    hashtag
    Maintenance

    • NoDatabase: Correct store user profile

    • Don't block repository schema upgrade when development is disabled

    • Tweaked ExecuteQuery, get count/totalItems first, if zero skip rest

    hashtag
    July 2016

    hashtag
    New Features

    hashtag
    Wizard State

    • Added AsWizard state behavior

    • Wizard PO support

    hashtag
    Default Values

    • Added POA.DefaultValue

    • Allow custom default value

    • Added DefaultValue/CustomDefaultValue to POABuilder

    hashtag
    Web2 CDN Handler

    • Added simple Web2 handler that uses CDN

    • Allow override for Web2 version on CDN

    hashtag
    Fixes

    • Fixed issue when you change a POAWR that has a linked POAWR

    • Fixed issue with GetReport to xml and 0x00

    • Fixed Azure issue when proxying CDN

    hashtag
    Maintenance

    • Added OnHelp hook

    • Removed hardcoded dependency for WindowsAuthentication on HttpContext

    • Fallback to WindowsIdentity.GetCurrent() instead of null for GetClientIdentity

    hashtag
    June 2016

    hashtag
    New Features

    hashtag
    Custom API Controller

    • Extract base CustomApiController class from CustomWebController

    • Better API abstraction

    hashtag
    Notification Duration

    • Added NotificationDuration

    • Control notification display time

    hashtag
    Auth Token Validation

    • Added WebController.ValidateAuthToken

    • Exposed HttpEx

    hashtag
    Fixes

    • Fixed issue with delete and check violation throwing ValidationException

    • Fixed issue when deleting query

    • Fixed issue with adding custom filters

    hashtag
    Maintenance

    • NoLicense: Don't use License settings anymore

    • Websites: Classic -> Legacy and Web2 -> Default

    • Added option to include custom filters from code

    hashtag
    May 2016

    hashtag
    New Features

    hashtag
    Retry Action

    • Added ability to ask end-user for confirmation/more information during ExecuteAction

    • Handle retry logic on actions

    • Added ability to include PO with RetryAction

    hashtag
    Fixes

    • Fixed issue with MinValue/MaxValue business rule on nullable properties

    • Fixed issue with multiple CORS handlers

    • Fixed pages issue in Websites

    hashtag
    Maintenance

    • Added ability to specify if SelectAll is enabled for a Query

    • Tweaked outdated browser behavior

    • Include correct HTTP code when requesting report that has an error

    hashtag
    April 2016

    hashtag
    New Features

    hashtag
    Builder Enhancements

    • Allow removing of attributes on PO

    • Added DataTypes.Determine method to detect the best DataType

    • Allow setting of ReferenceBreadcrumb in builder

    hashtag
    Advanced Hooks

    • Added ability to persist user settings during SaveUserSettings

    • Added GetKey hook

    • Added hook for unknown custom action method

    hashtag
    Fixes

    • Fixed issue with routes not being updated when PU/PO/Q is changed/added

    • Fixed issue with CanRead being false in QueryExecuted when ExecuteQuery is used

    • Fixed issue with NoDatabase and using Builder

    hashtag
    Maintenance

    • When creating new group/tab from builder also set Name

    • Added ability to specify different breadcrumb when displaying on reference (POAWR/QRI)

    • Fixed issues when bulk-editing POAs

    hashtag
    March 2016

    hashtag
    New Features

    hashtag
    Visual Studio Integration

    • Added VisualStudioIntegration

    • Builder: Support extra buttons from Vidyano.Service

    • Builder: Don't lock referenced Vidyano.Service

    hashtag
    Websites Features

    • Allow groups for reports as well

    • Advanced: Allow custom profiler entries

    hashtag
    Fixes

    • Fixed issue when creating new DataType

    • Fixed issue with title being set on vi-app instead of label

    • Fixed issue with invalid query sortoptions for reports

    hashtag
    Maintenance

    • Expose X-ElapsedMilliseconds when using CORS/Profiler

    • Websites: Also check virtual path ignoring case

    • Prefer namespaces for webcomponent's ts

    hashtag
    February 2016

    hashtag
    New Features

    hashtag
    Websites and Pages

    • Initial commit for Websites/Pages

    • Watch websites files for changes and update cache

    • Allow reordering of pages

    hashtag
    NoDatabase Mode

    • Load settings from settings.json (with first-time migration)

    • Load users from users.json (with first-time migration)

    • Handle Saving/Deleting of users/groups

    hashtag
    Fixes

    • Fixed issue with old UI and OnAddReference

    • Fixed issue when saving website changes

    • Fixed issue when website binding ends with /

    hashtag
    Maintenance

    • Expose Website on Manager.Current

    • Added option to specify Id for GroupBuilder

    • Keep highest NotificationType when adding a notification

    hashtag
    January 2016

    hashtag
    New Features

    hashtag
    NoDatabase Support

    • Initial NoDatabase implementation

    • Settings, users, and groups stored in JSON files

    • First-time migration from database

    hashtag
    DbGeometry Support

    • Added support for DbGeometry

    • Spatial data handling

    hashtag
    Fixes

    • Fixed a bug with formatted negative numbers

    • Fixed issue with LogsVerbose failing when repository database is not available

    • Fixed issue with verbose logging when the TargetContextType contained invalid characters

    hashtag
    Maintenance

    • Give priority to QueryResultItemValue typehints over QueryResultItem

    • Change viConfigure actions to use Navigate ClientOperation

    • Show more information when EfObjectConverter.cctor can't load assembly types


    Note: 2016 was a transformative year with 330 commits introducing NoDatabase mode, Websites/Pages functionality, Two-Factor Authentication, Swagger API support, Visual Studio integration, and the transition to Web2 as default.

    Grouping

    circle-info

    These screenshots are from older versions, some minor UI changes can be expected

    An opt-in feature that should be enabled per attribute that an user can group on. Will allow them to see the query grouped by the attribute that they selected instantly showing the count per group and the ability to collapse those groups.

    You can use this feature by setting the “Can group by” to Yes on the attribute.

    Users can then use the context menu on a query grid to enable grouping for that attribute.

    Getting started

    hashtag
    Getting the correct tools

    Make sure .NET 8.0 SDK is installed (https://dotnet.microsoft.com/download/dotnet/8.0arrow-up-right) (Vidyano v6 can also be used with .NET 9.0 but the project template uses .NET 8.0 by default)

    Install the Vidyano dotnet new templates

    dotnet new install Vidyano.Templates::1.0.20241119.5814

    Trust the development certificate (needs to be done once on a development machine)

    dotnet dev-certs https --trust

    You only need to do this once.

    hashtag
    Create your first Vidyano application

    The latest version currently is 6.0.20250305.5880 (you can check the .csproj file for the version you are referencing), in most cases you can immediately update your even before running the application.

    Documentation

    hashtag
    Persistent Objects

    Persistent Objects in Vidyano are utilized to represent various data structures, including:

    • Tables: Directly mapping to database tables.

    • Collections: Representing groups of related items.

    • Entities: Defining individual records or objects.

    • Virtual Forms: Describing forms with a set of fields without a direct database mapping.

    hashtag
    Key Features

    • Flexibility: Capable of representing both physical and virtual data structures.

    • Customization: Allows for the definition of fields, relationships, and behaviors tailored to specific needs.

    hashtag
    Use Cases

    • Data Representation: Managing complex data structures within the application.

    • Form Design: Creating virtual forms to capture and process user input efficiently.

    Persistent Objects are a fundamental component of Vidyano, providing a versatile mechanism for data management and interaction.


    hashtag
    Queries

    Queries in Vidyano are used to retrieve and display data in various ways. There are three primary types of queries:

    hashtag
    Context Property Queries

    These queries map directly to a property on the context, typically representing entire database tables. They are straightforward and provide a direct view of the underlying data.

    hashtag
    Detail Queries

    Detail queries are used to fetch data related to a specific entity. They display records based on their parent entity, allowing for a focused view of related data.

    hashtag
    Custom Queries

    Custom queries offer the most flexibility, allowing developers to implement complex business logic in code. These queries can filter data, retrieve information from external services, or provide customized views tailored to specific needs.

    Each type of query serves distinct purposes and provides a powerful mechanism for data retrieval in Vidyano.

    hashtag
    Examples


    hashtag
    Persistent Object Attributes

    Attributes in Vidyano represent individual fields within a Persistent Object. They can be:

    • Linked Attributes: Directly connected to a class property.

    • Virtual Attributes: Used in code but not mapped to a database field, ideal for scenarios like contact forms or additional processing options.

    Attributes contain detailed metadata such as:

    • Name: The identifier for the attribute.

    • Data Type: Specifies the type of data (refer to the Data Types section for more details).

    • Position: Determines its placement in the interface.

    Attributes also have customizable hints, such as displaying a dropdown as a select box or radio buttons. This flexibility allows developers to create intuitive and user-friendly interfaces.


    hashtag
    Data Types

    Vidyano supports a range of built-in data types to represent different kinds of information:

    • Primitive Types: Includes basic types like string, integer, datetime, and datetimeoffset.

    • Multiline String: Provides a text area for users to input large amounts of text.

    Developers can also create custom data types to represent specific business needs:

    • Custom Data Types: For example, an IBAN bank account number or a phone number. These can be reused across the application and have specific logic for display and input.

    Data types dictate how information is presented, whether in a persistent object or within a query. For instance, an Image Data Type might display the image directly in a query, while in edit mode, it allows users to upload or paste a new image.

    This flexibility enables developers to tailor the application to specific requirements.


    hashtag
    Business Rules

    Business Rules in Vidyano allow you to enforce predefined validation rules across your application. Some of the built-in rules include:

    • NotEmpty: Ensures that a field is not left empty.

    • Required: Mandates that a field must be filled.

    • Min/MaxValue: Sets minimum and maximum values for numeric fields.

    In addition to these, developers can write custom business rules in C# to handle more complex validation logic. This involves:

    • Custom Validation: Writing code to evaluate the data input by the user and determine if it meets the required criteria.

    • Error Messaging: Displaying validation error messages when the input does not comply with the rules.

    Business Rules provide a robust mechanism for maintaining data integrity and ensuring consistent validation throughout the application.


    hashtag
    PersistentObjectActions

    The Actions class in Vidyano is linked to specific Persistent Objects and is crucial for implementing custom logic, named following the [PersistentObject]Actions convention. Key functionalities include:

    • Custom Logic: Execute code when an entity is loaded, created, saved, or deleted.

    • Query Execution: Add logic when executing queries, enhancing data processing.

    • Versatile Methods: Provides various methods to handle different stages of an entity's lifecycle.

    This class is widely used for customizing application behavior, providing developers with powerful tools to manage

    The Legacy v5.x also contains relevant information about .


    hashtag
    Custom Actions

    Custom Actions in Vidyano are user-defined actions, typically represented as buttons, that can be placed on Persistent Objects or Queries. They provide a flexible way to extend functionality.

    hashtag
    Key Features

    • Role-Based Visibility: Custom Actions can be controlled via user roles, allowing developers to specify when and where these actions are visible.

    • Contextual Behavior: On a Query, actions can be configured to require conditions, such as

    hashtag
    Examples of Using Custom Actions

    Custom Actions can be used for a variety of tasks within Vidyano. Here are a few practical examples:

    • Send Email Action: This action can be used to send an email to a selected customer. When triggered, it opens a predefined email template and sends it to the customer's email address.

    • Import Data Action: This action can be placed on a customer query, allowing users to import data from a file. When the import button is clicked, a dialog appears for selecting a file, and the data is imported accordingly.

    • Download Action: This action allows users to export download data for a specific Employee. When the user clicks the Download button, the data is fetched and will show a download dialog in the browser to save the result.

    These examples illustrate the versatility of Custom Actions, enabling developers to extend Vidyano's capabilities to meet specific business needs.


    hashtag
    Menu

    The menu in Vidyano provides a structured way for end users to navigate through the application. It consists of:

    • Program Units: Higher-level items in the menu that can be easily shown or hidden based on user rights. Each application can have multiple program units.

    • Program Unit Items: These are links within a program unit and can point to a query, a persistent object (e.g., an account page), or even an external URL.

    The entire menu system is driven by user rights, ensuring users only see the options they have access to. Additionally, developers can implement hooks to further control the visibility of program units or dynamically add new values.

    This system offers a flexible way to organize and manage the application's navigation, enhancing user experience.


    hashtag
    Web API Hooks

    Vidyano allows you to extend your application by adding custom API methods. Each application comes with a predefined web file, named using a specific naming convention ([schema]Web), which acts as a built-in API controller.

    hashtag
    Key Features

    • Custom Methods: You can add methods that are accessible via the /api/[methodName] endpoint.

    • Flexible Authentication: API methods can be configured to require authentication, support anonymous access, or use custom authentication mechanisms.

    • ApiArgs: Each method receives an ApiArgs

    This system offers a flexible way to extend your application's functionality, allowing you to handle various scenarios and integrate external services seamlessly.


    hashtag
    Settings

    Vidyano provides a variety of settings that can be configured to tailor the application to specific needs. These include:

    • Built-in Settings: Accessible from the management interface, these settings cover a range of configurations, such as:

      • SMTP Configuration: For managing feedback or email sending settings.

      • Default Language and Culture: Setting the application's default language or cultural preferences.

    These settings provide a flexible mechanism to customize the application behavior, from basic configurations to more complex feature toggles and external service settings.

    The Legacy v5.x documentation also contains relevant information about .


    hashtag
    Logging

    Vidyano includes a built-in logging system that records events and errors, storing them in the database (SQL or RavenDB). Key features include:

    • Automatic Logging: The application logs important events automatically, such as metadata synchronization, incorrect sign in attempts or faults.

    • Error Logging: Records exceptions and faults, providing developers with detailed information during development and troubleshooting.

    • Custom Logging: Developers can add custom logs via code, useful for tracking specific events or processes.

    This robust system ensures that developers have comprehensive insights into application behavior and can quickly identify and resolve issues.

    hashtag
    Verbose Logging

    Vidyano also supports a concept, where all requests are logged automatically with detailed information. This feature is invaluable for advanced troubleshooting and collecting metrics, allowing developers to gain deeper insights into application performance and user interactions.


    hashtag
    Advanced Topics

    hashtag
    Authenticator Service

    The Authenticator Service in Vidyano is based on a naming convention ([schema]AuthenticatorService) and extends the base Authenticator Service class. This class is crucial for mapping users and verifying credentials. Key functionalities include:

    • Default Authentication: Uses BCrypt-encrypted passwords stored in the database.

    • External Providers: Supports integration with external authentication providers like Azure AD, Google, and Microsoft.

    • Custom Authentication: Allows implementation of custom password logic.

    The Authenticator Service provides extensive flexibility, enabling developers to tailor authentication processes to specific requirements.

    Check the legacy v5.x documentation about configuring

    hashtag
    Advanced Base Class

    Vidyano includes an advanced class, named using a specific naming convention ([schema]Advanced), that provides numerous hooks to extend or modify built-in features. While these hooks are less frequently used, they are invaluable for specific scenarios.

    The Advanced class is ideal for developers needing fine-grained control over the application's behavior.

    hashtag
    Courier Messaging

    See related document , can be used in RavenDB for message based communication.


    hashtag
    Context

    The Context class in Vidyano is a core component used for database interactions. Named following the [schema]Context convention, each application has at least one Context class. Key features include:

    • Database Interaction: For SQL Server, it's based on Entity Framework's DbContext. For RavenDB, it wraps the IDocumentSession.

    • Scoped Service: A single instance per request, used across the application.

    • Data Management: Provides properties for tables or collections and includes helper methods to add, remove, and save changes.

    The Context class is essential for managing data access and interactions, providing a flexible and powerful way to handle database communication.


    hashtag
    Custom UI

    Vidyano offers a default user interface out-of-the-box, allowing you to run applications without writing HTML or JavaScript. However, you can create custom components for specific needs, such as new data types or unique UI elements.

    Custom UI is particularly useful for:

    • New Data Types: When adding new data types, you can design custom UI components.

    • Unique Requirements: For cases where the built-in UI doesn't meet your needs, custom components allow full control over the interface.

    This flexibility ensures you can tailor the user experience to your application's unique needs.

    Source code is available on https://github.com/Vidyano/vidyano together with a sample Vidyano application to showcase the different data types.


    hashtag
    Samples

    This section provides a collection of sample projects and code snippets to help you understand various use cases. These samples are designed to be downloaded and run, offering practical examples of how to implement different features in Vidyano.

    While the full details are found in the code, the documentation highlights:

    • Common Use Cases: Real-world scenarios demonstrating key Vidyano features.

    • Code Examples: Sample code illustrating how to achieve specific tasks.

    • Downloadable Projects: Ready-to-run projects you can explore and adapt.

    These samples serve as a practical reference, helping you to quickly grasp how to leverage Vidyano's capabilities in your own projects.

    hashtag
    Sample Projects

    1. Web3: Web3 is a sample Vidyano application that showcases various data types and custom UI components. It provides a comprehensive overview of Vidyano's capabilities and how to implement them in your projects.

    2. VidyanoRavenSample: A sample project demonstrating how to use RavenDB with Vidyano. It includes a basic setup and configuration to get you started with RavenDB in Vidyano.


    hashtag
    Tips and Tricks

    Vidyano offers several developer-centric features to enhance productivity:

    • Profiler: Open the profiler while the application runs in the browser to view details of requests, including methods called, parameters, database calls, and performance metrics.

    • Control + Right-Click: Use this shortcut to open a pop-up menu for quick navigation within the management interface.

    • Impersonation: Test various user roles by impersonating users without needing to log in separately.

    These features streamline development and testing, making it easier to manage and optimize your Vidyano applications.


    This document provides a structured guide to working with Vidyano. For further details, explore each section and refer to the provided code snippets.

    5.28.2+bc49431

    Thursday, November 30th, 2017

    hashtag
    Features

    • Added Advanced ACS hook to passthrough a custom domain

    • Added Manager.StartTime property to get AppDomain start time (also available in diagnostics)

    • Added support for byte/sbyte/short/ushort/uint properties for Display on total

    • Added CustomApiController.GetWebsiteContent hook to customize html for a website index.html

    hashtag
    Changes

    • Allow authenticated API calls and Instant Search using default user

    • Made PersistentObjectAttribute.GroupName setter public

    • Replaced Advanced.BlacklistedPasswords property with Advanced.IsPasswordBlacklisted method

    hashtag
    Fixes

    • Fixed issue when throwing ValidationException using a single message

    • Fixed issue when using Builder to create/update messages

    • Fixed issue when changing custom settings not showing new value until application restart

    2.0.0

    hashtag
    Breaking Changes

    hashtag
    Removed shim libraries and thereby out of the box support for Internet Explorer

    This version drops out of the box support for Internet Explorer. This means a lot of the shim libraries have been removed in favor of adding the following code to your index.html:

    circle-exclamation

    Note that this will also be the last major version of the Vidyano web client that will support Internet Explorer at all.

    hashtag
    Upgraded Typescript to version 3

    This update together with the removal of the shim libraries (see below) will require you to add a lib section to the tsconfig.json file:

    hashtag
    Deprecated LINQ for JavaScript and removed all references from base library

    The most major breaking change is the deprecation of the linq.js base library.

    hashtag
    The bad news

    • all code using LINQ for JavaScript will write a deprecation warning to the console. The next major version of the client will no longer include the library by default.

    hashtag
    The good news

    • we added replacements for the most used functions directly on the native JavaScript Array prototype.

    • you can easily include the library if you choose not to migrate your code. Simply add the following line of code to the ```<head>``` element in your index.html file:

    • adding this code below the Vidyano import will also get rid of the deprecation warning in version 2.

    hashtag
    Migrating away from linq.js

    Enumerable.from

    Can be omitted in most cases as the argument will most likely be an array already. In case the argument is for example a DOM NodeList, you can use the native Array.from() function instead:

    Array extensions

    Enumerable.SelectMany

    SelectMany can be easily written with native JavaScript:

    hashtag
    What's New

    hashtag
    Tags

    You can now add the inputtype=tags typehint to a MultiString attribute to display the strings as tags.

    hashtag
    is-ie attribute on vi-app

    This attribute is now added automatically to the vi-app element so the child elements can more easily add custom styles via :host-context specifically for Internet Explorer.

    Changelog 2024

    hashtag
    December 2024

    hashtag
    New Features

    hashtag
    Metadata Lookups (#381)

    • Added metadata lookup system

    • Better data relationships and lookups

    hashtag
    Query Enhancements

    • Added ColumnOverride.IncludeAllContent

    • Include all content in query results

    hashtag
    Options

    • Added option to disable courier and inform if no recipients

    • Better message handling control

    hashtag
    User Creation

    • Added CreateForUser with OriginalUser

    • Track original user in impersonation scenarios

    hashtag
    Fixes

    • TimeZone America/Nuuk was renamed

    • TimeZone Europe/Kyiv was renamed

    • KeyValueList distincts wrong when text search is used

    hashtag
    November 2024

    hashtag
    New Features

    hashtag
    .NET 9.0 Migration

    • BREAKING: Migrated to .NET 9.0, removed .NET 6.0 support

    • Take advantage of latest performance improvements

    hashtag
    InitializeByCtorAttribute

    • Added InitializeByCtorAttribute

    • Support for constructor-based initialization

    hashtag

    • Idempotent courier messages (RavenDB)

    • Prevent duplicate message processing

    hashtag
    Performance Optimizations

    • Optimize .Run for non-enumerables

    • LeastRecentlyUsedCache/Set implementation

    • Builder optimizations

    hashtag
    Fixes

    • Typo in SynchronizeBlacklist

    • Certificate loading on .NET 9 (RavenDB)

    • Keep POAWR casts logic in sync with FromServiceString

    hashtag
    Maintenance

    • Updated packages

    • Builder marked as disposable with lazy scope creation

    • Use LINQ and collection expressions

    hashtag
    October 2024

    hashtag
    New Features

    hashtag
    (RavenDB)

    • Added Courier for message queuing

    • Support for delayed messages

    • MessageType hook for custom handling

    hashtag
    .NET 9.0 Support

    • Added .NET 9.0 support

    • Prepare for next LTS release

    hashtag
    TranslatedString Improvements

    • Added TranslatedString.DefaultGetLanguages

    • Various TranslatedString improvements

    • Better multilingual support

    hashtag
    CLI Enhancements

    • Added vidyano-synchronize-schema CLI option

    • Easier schema synchronization

    hashtag
    Authentication Extensions

    • Expose HttpContext on ForgotPasswordArgs

    • Add hook for GetExpressionForUserGuidColumn

    hashtag
    Fixes

    • Report warning for minimum level was wrong

    hashtag
    Breaking Changes

    • Keep semicolon in To field as single MailMessage

    • Changes email parsing behavior

    hashtag
    Maintenance

    • AppHarbor no longer exists (removed references)

    • Consistent Tag properties across system

    • Provide explicit cast to PO[] for AsDetail attributes

    hashtag
    September 2024

    hashtag
    New Features

    hashtag
    ExecuteBatch API

    • Initial ExecuteBatch and split ExecuteQuery implementation

    • Handle GetPersistentObject, GetQuery, and ExecuteAction in batch

    • Handle step assignments with DynamicAssignment

    hashtag
    TranslatedString Enhancements

    • Added TranslatedString.IsValid

    • Better validation for translations

    hashtag
    LabelHelper

    • Added LabelHelper for consistent label management

    • Centralized label generation

    hashtag
    RavenDB Source Generator

    • Provide attributes for the source generator

    • Better code generation support

    hashtag
    Fixes

    • Detail attribute loading after save of new object

    • Handle invalid sorting in .NET Core

    • Fixed issue #356

    hashtag
    Maintenance

    • Performance: Prefer JsonPoolConvert usage

    • Compiler optimize unused ApplicationInsights

    • Updated packages

    hashtag
    August 2024

    hashtag
    New Features

    hashtag
    Repeating Jobs

    • Expose IRepeatingJobManager

    • Added RegisterJobAsync method

    hashtag
    DataType Support

    • Support [DataType] attribute

    • Better validation and UI hints

    hashtag
    Settings Builder Extensions

    • Added ISettingsBuilder.MultiString/Custom

    • More flexible settings configuration

    hashtag
    Updatable Logs

    • Added IUpdatableLog.Delete

    • Better log management

    hashtag
    Web Application Integration

    • Added UseVidyano directly on WebApplication

    • Simplified startup configuration

    hashtag
    Query Column Overrides

    • Added ColumnOverrides for GetQuery request

    • Customize query result columns

    hashtag
    Fixes

    • AsReadOnly setting didn't work for DataType Password

    • Missing DataMember attributes

    • Missing reserved web2 words

    hashtag
    Maintenance

    • Expose StartupErrors for manual invocation

    • Updated documentation

    • Updated packages

    hashtag
    July 2024

    hashtag
    New Features

    hashtag
    Memory Diagnostics (#374)

    • Add memory information to diagnostics

    • Better monitoring of application memory usage

    hashtag
    Log Hashing (RavenDB) (#375)

    • BREAKING: Added MessageHash to Raven logs

    • Enables deduplication and better log analysis

    hashtag
    Query Sorting (#377)

    • Allow SortOptions to be passed to GetQuery

    • More flexible query result ordering

    hashtag
    Date Handling (#376)

    • Improved invalid date handling with tests

    • More robust date parsing

    hashtag
    Description Attributes

    • Read [Description] attribute for custom actions

    • Better auto-documentation

    hashtag
    Fixes

    • BREAKING: Logs_Search index was wrong

    • Missing alias in SQL statement for IsUserAuthTokenRevoked (PostgreSQL)

    hashtag
    Maintenance

    • Updated packages

    • Performance: Prefer lockless access in Optimizer

    • Trim and normalize line endings for Description

    hashtag
    June 2024

    hashtag
    New Features

    hashtag
    RavenDB Database Check

    • Added default enabled RavenDBOptions.CheckDatabaseExists

    • Automatic database existence verification

    hashtag
    Settings Improvements

    • TrackLastLoginDateWithTime setting

    • Decode Settings ID if not found

    • Better settings management

    hashtag
    Logging Enhancements

    • Allow verbose logs on GetApplication

    • Log more data if ExecuteAction throws exception

    • Handle Language before user exists (e.g., invalid password)

    hashtag
    Performance

    • Use Environment.WorkingSet for showing memory usage

    • Removed lock for GetCachedEntityModel

    hashtag
    Fixes

    • Fixed cacheupdate reloading loop

    • Handle issue where user has a group ID that no longer exists

    hashtag
    Maintenance

    • Dropped .NET 7 support (end of life)

    • Updated packages to .NET 8

    • Updated Web3 for test projects

    hashtag
    May 2024

    hashtag
    New Features

    hashtag
    Query Optimizations

    • Added TryGetChildCollectionAsQueryable

    • Makes detail queries use database queries for better performance

    hashtag
    Caching Improvements

    • Use byte array directly for cache set

    • Better performance for cache operations

    hashtag
    IgnoreProperty Extensions

    • Allow IgnorePropertyAttribute on Context as well

    • More flexible property ignoring

    hashtag
    Proxy Support

    • Added GetClientIpFromProxiedRequest hook

    • Better support for applications behind proxies

    hashtag
    Fixes

    • Fixed issue with HasGlobalSearch not being set

    • Made verbose log more fault resilient

    hashtag
    Maintenance

    • Updated packages

    • Publish artifacts for release pipeline

    hashtag
    April 2024

    hashtag
    New Features

    hashtag
    Advanced Hooks

    • Added Advanced.PreUserSettings

    • Customize user settings before loading

    hashtag
    KeyValueListHandler

    • Added KeyValueListHandler for custom key-value processing

    • More flexible data handling

    hashtag
    Two-Factor Authentication

    • Integrate TwoFactor with IDistributedCache to prevent replay attacks

    • More secure authentication flow

    hashtag
    Fixes

    • Reordering program units does not sort items correctly

    • Handle RequestUri when HttpContext is disposed

    hashtag
    Maintenance

    • Removed obsolete code for DocumentFormat

    • Updated packages

    • Added mail documentation

    • NonNullable consistency improvements

    hashtag
    March 2024

    hashtag
    New Features

    hashtag
    LazySessionOperations Helper (RavenDB)

    • Added LazySessionOperationsEx.NullLoad helper

    • Optimizes null checking in lazy operations

    hashtag
    Array Helpers

    • Added AsArray helper

    • Fixed GetEntities bugs

    hashtag
    Report Improvements

    • Prefer keys by default in GetReport

    • Added Advanced.IsReportAllowed hook

    hashtag
    Authentication Enhancements

    • Added AuthenticatorService.GetAuthTokenExpiration

    • Better token management

    hashtag
    Fixes

    • Handle IsAllowed on AsyncStreamingAction

    • Fixed issue on New with shadow FK in Entity Framework Core (#372)

    hashtag
    Maintenance

    • Updated demo JSON files

    • Switch demo to Web3

    • Added mode to only update JSON files

    • Manager.GetGroup nullability improvements

    hashtag
    February 2024

    hashtag
    New Features

    hashtag
    ISplittedValueObjectHandler Interface (#369, #370)

    • New interface for handling split value objects

    • Enables custom value object splitting logic

    hashtag
    Caching Improvements

    • Added and implemented AggressivelyCacheForAnHour

    • Better performance for frequently accessed data

    hashtag
    Manager Helpers

    • Added Manager.HasCorrectTimeZoneOffset helpers

    • Better timezone handling in applications

    hashtag
    OpenOperation Extensions

    • Added OpenOperation.WithPreClient

    • Allows pre-processing before client operations

    hashtag
    KeyValueList Enhancements

    • Added generic KeyValueListAttribute

    • More flexible key-value list handling

    hashtag
    Virtual Entity Loading

    • Better handling of loading virtual entities

    • Improved performance for virtual entity operations

    hashtag
    Extension Methods

    • Added CloneAndAdd extension method (#367)

    • Simplifies collection manipulation

    hashtag
    Fixes

    • Don't use AsNoTracking if not optimized

    • Fixed Abstractions using wrong XML file

    • Fixed Web2 vulcanize call without path

    hashtag
    Maintenance

    • Security updates for packages

    • Removed unused CommonMark package

    • Updated packages

    • Prefer Attribute IsDefined for better performance

    hashtag
    January 2024

    hashtag
    New Features

    hashtag
    Entity Helper Methods

    • Added PO/POA GetEntity/GetRequiredEntity helper methods

    • Simplifies entity retrieval with null safety

    hashtag
    Azure Storage Enhancements

    • Added AzureStorageAccount HasKey/GetContainer methods

    • Better Azure blob storage integration

    hashtag
    BinaryFile Improvements

    • Added BinaryFile implicit cast to string and TryParse

    • Easier file handling and conversion

    hashtag
    RavenDB Query Helpers

    • Added IRavenQueryable GetSum helper

    • Simplifies aggregate queries in RavenDB

    hashtag
    PersistentObject Enhancements

    • Added PersistentObjectTypeName helper

    • Added POA.Actions for accessing available actions

    • Hide Edit/New/Delete lines on PO Rights detail query when not needed

    hashtag
    Fixes

    • Ignored disposed DatabaseConnectionState for RavenDB

    • Ignored ConnectionResetException in custom API methods

    • Fixed calling RefreshOperation with only type name

    hashtag
    Maintenance

    • Updated copyright year to 2024

    • Updated NuGet packages

    • Added XML documentation comments


    Note: Commits marked with (test) have been excluded from this changelog as they are internal testing commits.

    5.36.0+5338103

    Tuesday, April 17th, 2018

    hashtag
    Features

    • Added GetTextSearchColumnsForValue method to limit the columns to use depending on the searched value (i.e. 2018 should only search on dates and not numbers)

    • Added ApiMethodAttribute.TryAuthentication property to allow Basic authentication on the api method if supplied, otherwise the api method can still use custom authentication logic

    • Require two-factor code (if configured) for changing password or removing two-factor

    • Added scim hook for filtering users/groups

    • Added AuthenticatorService.GetCredentialType for new sign-in experience (includes new messages)

    hashtag
    Changes

    • Changed default expiration for authtoken from 2/28 days to 12 hours/2 days

    • Changed throttle behavior for invalid passwords (defaults to 5 tries per window of 30secs and a maximum of 5 failed attempts per 10 minutes per user/ip combination)

    • Added basic retry logic when logging verbose logs fails (connection closed, keep-alive issues)

    hashtag
    Fixes

    • Fixed issue with authenticate not updating internal caches first

    • Fixed issue when double-saving new feedback (following saves are skipped when ObjectId is not empty)

    5.24.0+a20f7c

    Thursday, August 31th, 2017

    hashtag
    Features

    • Added the PreviewLoadArgs.HandleAsNew method to convert a load to a new

    • Made the auth token expiration time in days configurable (app settings Vidyano.AuthTokenExpiration and Vidyano.AuthTokenExpirationStaySignedIn)

    hashtag
    Changes

    • Never use Web2 CDN if Vidyano.Web2 NuGet package is installed

    • Made PersistentObjectAttributeWithReference.SelectInPlace property public

    • Always detect classes with ComplexTypeAttribute as being mapped to the database

    hashtag
    Fixes

    • Fixed issue with ?id=X not working for api methods

    • Fixed issue with distinct values for translated string attributes

    • Fixed issue with DefaultPersistentObjectActions being used for internal Vidyano objects

    Fixed some issues when switching between Verbose modes
  • Fixed issue when report is accessed behind proxy (e.g., CloudFlare)

  • Updated EF to 5.2.0
  • Fixed EOL for POAReference file

  • Updated reports help documentation

  • Reports issues fixes

  • Constants for string array allocations

  • Fixed multi-threading issue with UpdateLastLoginDate

  • Fixed issue when throwing new ValidationException
  • Fixed patch importing

  • Extended GetReport xsd information
  • ACS dev messages

  • Handle Accept request header for reports

  • Prefer DbContext.SaveChanges for PersistChanges

  • Skip updating security.json when deleting user with rights

  • Added logging when report is accessed insecurely

  • Don't verbose log outgoing content for GetReport/Api

  • Insecure report tweaks

  • Added InstantSearchArgs.AddRepository

  • Fixed issue with Query UserRight not having filter

  • Fixed issue with newly created user not loading groups

  • Fixed issue with new user having Users groups twice

  • Fixed NRE when using inprocess http handler

  • Also order POAWR and POAAD
  • Keep original CanPopulateAttributeValues when calling PO.SaveDetails

  • Extra logging during cache update handling

  • Added default/cancel options for RetryAction

  • Update group cache item

  • Refresh rights queries when saving/deleting right

  • Changed GenerateLocalAuthToken to use same long expiration as staysignin

  • Changed TypeCache IsAnonymous lazy mode

  • Extra rights

  • Fixed issue when trying to delete Log/Feedback
  • Fixed issue with anonymous projection on EF queryable

  • Fixed CodeFirst issue with new project

  • Fixed issue with newly created user not loading groups

  • Don't allow viImpersonate on Group

  • Added LoginArgs for forward compatibility

  • Better detection for Code First mapped types

  • Fixed viImpersonate not working on PO

  • Request all known html files when a new version is requested

  • Extra logging for Web2Cdn + disable flag

  • Also use admin password for User user in new project

  • Made ImageUtils public

  • Handle ACS token validation through proxy

  • Don't show newoptions on ServiceAction' Rights query

  • Ignore RetryActionException when logging

  • Also show innerexception for UpdateException/DbUpdateException

  • Use same logic for decimal.ToServiceString() as client

  • Fixed issue with AutoCreateUsersInGroup on Security PO

  • New CDN appSetting

  • Disable sliding auth token by default
  • Doubled auth token expiration days (and made configurable)

  • Fixed issue with ?id=X not working for api methods

  • Fixed issue when TranslatedString attribute doesn't return json but returns string

  • Fixed issue #77

  • Fixed issue #78

  • Fixed issue #79

  • Fixed issue #82

  • Fixed issue #83

  • Fixed issue #85

  • Fixed issue #86

  • Fixed issue with New Group still being added to patches

  • Fixed issue with distincts on asLookup query

  • Fixed issue with Random not being threadsafe

  • Added some extra information to exceptions
  • Allow loading of QueryFilters PO for Query

  • Throw error instead of set notification when ReOrder fails

  • More information for "Failed upgrading repository metadata."

  • Make sure we set new parent on detail attributes before checking rules

  • Added comment that POActions.Where is used for FindByObjectId

  • Don't show unselectable groups

  • Added xml comments to explain which claims are used for UnknownUser

  • Handle include filters when query is being added/removed during OnLoad

  • Use args for HandleSwaggerMetadata

  • Fixed issue with custom query with other TEntity not using DefaultPOA

  • Fixed issue when Native client connects to a production environment

  • Fixed NoDatabase issue with filters

  • Fixed invalid query sortoptions for query reports

  • Added some reserved words for program unit names/routes handling
  • Added .NET 4.7 detection

  • Updated available type hints for attributes

  • Partial fix for #69

  • Updated NuGet dependencies (JSON.NET/OpenXml)

  • Performance fixes

  • Fixed issue with TypeConverter and Enum
    Don't add Queries to Word PO when PO IsNew
  • Comment about limits

  • Updated TypeScriptToolsVersion to 2.2

  • Allow direct GetPersistentObject isNew call

  • Changed WebAPI path registration name

  • Throw error when report' userId no longer exists

  • Use TypeConverter for From/ToServiceString

  • Don't show outdated model message when model hash is IGNORED

  • Allow changing of IUser.Profile

  • Use default .ToString for enums for .ToServiceString

  • Fixed issue #58

  • Feature detect Jurassic dependency

  • Fixed initialization error for new projects

  • Marked ConvertFromCommonMark obsolete
  • Updated EntityFrameworkPerformanceAnalyzer package

  • Performance tweak for GetEntitiesForDeletion

  • Clean up todos

  • Made Website.Label not required

  • Report tweaks

  • Allow removal of model.Templates

  • Allow content-type for SAS

  • Don't put dev only actions in model.json

  • Don't send authtoken for default user for security reasons

  • Tweaked viRegenerateToken action

  • Show unmapped column that couldn't be sorted on

  • Moved legacy Web logic to separate assembly

  • Added AddSorted for ICollection

  • Calculate CultureOptions once

  • More boolean filter values

  • Fixed issue with web2 vulcanize resource only having read access

  • Disable viRegenerateToken when Token is read only

  • Fixed issue with Read right being required for OnPreviewAction

  • Fixed issue with settings during NoDatabase synchronize
    Also show overridden settings in custom settings query
  • Changed new website template to use https for google fonts

  • Added ConfigureAwaitChecker Analyzer

  • Resharper: Allow vi prefix in methods

  • Added instant search docs

  • Added override vidyano settings docs

  • Don't check for new repository version when using NoDatabase

  • Show correct exception when NoDatabase RepositorySynchronizer fails

  • Show websites web2 version in diagnostics

  • Added ValueTuple package in Test project

  • Added more EditorBrowsable hints

  • Enabled C# 7 for ReSharper

  • Refactor: Split Query related POActions methods in partial file

  • Refactor SaveNew/SaveExisting

  • Reduced Web2Cdn versionLock

  • Made refactored methods protected for SaveNew/SaveExisting methods

  • Added ReferencePOActions example

  • Renamed POActionsReference

  • Include POActionsReference in NuGet package

  • Use C# 7 Roslyn compiler for building NuGet package

  • Tweaked POActionsReference

  • Ensure that VidyanoDbCache always has all the system settings

  • Refactor for C# 6/7 language features

  • Hide Query.GroupedBy

  • Fixed #10

  • Updated Add POActions wizard

  • Fixed issue when POActionsReference is used on new project

  • Changed exception for OnAddReference/OnRemoveReference without parent

  • Don't try to add missing ignored system settings for NoDatabase

  • Fixed issue with translations query not working after adding new lang
  • Fixed issue with invalid csv being generated

  • Updated release notes style

  • Added glossary

  • Removed QueryResultItem.Breadcrumb

  • Changed CORS handler to allow origin *

  • Fixed issue with new DataType not saving correctly

  • Fixed issue with POAWR on old ui

  • Fixed issue with new language being kept on error

  • Fixed issue with bulk edit on POA

  • Fixed issues when editing user rights

  • Fixed xml documentation on CreateTransactionScopeForAction
  • Updated usage for Effort

  • Don't fail on AddUserToGroup if user is already in that group

  • WIP for #22

  • Hide old type hints for Web2 client

  • Use base interface to discover DbSet/ObjectSet

  • Removed unneeded converting to and from base64 #25

  • Fixed issue with invalid version being used for comparison

  • Show better exception when enumerable can't be sorted

  • Performance tweak when filtering reference attribute

  • Not so private

  • Set Label when setting Name on new POA
  • Don't write to disk if hash match previous value

  • Allow passing of lang parameter for GetReport

  • Removed unused code

  • Use proposed routes

  • Added id for the GetQuery uri

  • Changed version logic for git support

  • Made Excel write logic public

  • Added gitignore

  • Fixed UTF-8 filename issue

  • Renamed files with special characters

  • Updated NuGet packages
  • Added more actions that should be ignored for creating a transaction

  • Changed default ValidationRulesFailed message

  • Show validation error from hidden attributes in PO Notification

  • Show MultiLine as hint for TranslatedString

  • Allow new PU

  • Added POA.FromServiceString

  • Performance: only need to sort once when adding multiple queries

  • Added ability to ignore model hash
    Disable cache-control when serving content from cdn
  • Changed AttributeCombinationIsUnique message

  • BREAKING: Default transactions behavior for OnSave

  • Removed unneeded type checks in ToServiceString()

  • Added ability to handle Stream.ToServiceString()

  • Fixed issue with default value always being set for numeric/date attributes
    Websites: Don't use Referer
  • Fixed issue when working with Cloudflare Flexible SSL

  • Also convert Manager.RequestUrl to https if forwarded by Cloudflare

  • Always make sure that new user's name is trimmed

  • VerboseLogs: Reduced time when cleaning up verbose logs from 4h to 15min

  • VerboseLogs: Improved database calls when cleaning up verbose logs

  • VerboseLogs: Delete per maximum of 5000 log records

  • Allow setting of Vidyano.Web2Version app setting to url for redirecting

  • Invalidate auth tokens when adding two-factor authentication

  • Fixed issue when SaveDetails is called without a context
  • Fixed translations issue when websites query was opened

  • Fixed bulk edit issue on PO

  • Ensure paging information is correct
  • Ignore orderby when counting enumerable sources

  • Use dynamic Where directly on IEnumerable instead of forcing AsQueryable

  • Pass json to business rule if using translated string attribute

  • Return 200 OK for Poll if everything is OK

  • Inline local script files only

  • Performance: Prefer generating parameterized queries

  • Prefer nl-BE culture when browser reports nl

  • Use UseWeb2Home app setting when serving cdn

  • Fill in default offset for first new POA

  • Added missing default translation for Edit

  • Updated RegEx to detect IE version

  • Made outdated page's images working on IE10+

  • Added Json helper method on CustomApiController

  • Added hook for single sign-out call from ACS

  • Enabled default values logic on POA

  • Fixed issue when NewWebComponent namespace ends with WebComponents
  • Fixed issue with verbose logging using database

  • BREAKING: Don't fill in default value for New PO if not set explicitly
  • Only switch to nullable type if current value is null

  • Allow loading of QueryColumn by Query Id and Attribute Name

  • Made RetryActionException public

  • Tweaked VisualStudioIntegration for new Web² logic

  • Refresh attributes tab when changing groups/tabs on PO

  • Rematerialize wizard PO

  • Allow relative resources during vulcanize

  • Always include salt in PO.SecurityToken to prevent misuse of encrypt oracle

  • Updated NuGet packages

  • Only ignore default value on value types if the attribute is visible on new

  • BREAKING: Removed strong name signing

  • Moved Jurassic from embedded to NuGet

  • Use correct datatype for custom default value attribute

  • Made App_Data\Help and App_Data\Icons folders optional

  • Show session attribute selector for default value

  • MultiLineString can be changed to ComboBox/DropDown

  • Log less requests to verbose logs

  • Don't log http exceptions except for 500

  • Splitted WebsiteConfig from VidyanoDbCache
  • Show multiline tool tip editor on POA

  • Added POA.ToggleRule

  • .NET detection for 4.6.2/4.6.1

  • Removed more uses of IsTrial checks

  • Added PersistentObjectAttributeAsDetail.RefreshObjects method

  • Fixed issues on IncludeFilter

  • Allow custom default filter

  • Prefer options for RetryAction over labels
    Fixed issue with parent reference attribute using wrong Value with OnNew
    NoLicense compilerflag
  • Hide/disable other code that uses license

  • Fixed windows authentication issues

  • Keep correct Root prefix when registering routes

  • Correctly detect website when using Root prefix

  • Fixed issue with DefaultOptions being cached on POA

  • Don't use License settings anymore

  • NoDatabase: Don't add License setting in settings.json after activating

  • Updated NuGet packages

  • Hide crawler related properties/methods on CustomWebController

  • Don't try to create proxy types when NoDatabase is enabled

  • Don't fail when AsDetail attribute' Objects is set to null

  • Added option for AsDetail attribute to mark detail obj as deleted

  • Allow configuration of allowed levels for projection

  • Don't use .Include for projected custom queries

  • Hide group on PUI if Name contains backslash

  • Update ObjectId to match name for PU/PUI on SaveExisting

  • Fixed text search issue on datetime's "today"

  • Send QueryFilter breadcrumb during OnLoad

  • Handle extra cases for tabs
    Fixed issue with using builder and adding new attribute
  • Fixed caching issue when creating or deleting user

  • Fixed serialize issue with groups in model.json

  • Updated Newtonsoft.Json to 8.0.3
  • Added more WebsiteTypes

  • Added code to remove duplicate tabs

  • Advanced: Expose more information about ProgramUnitItem

  • Also include Vidyano Service version in feedback

  • Added ability to export report to csv as well

  • NoDatabase: Fixed issue with ActivateLicense

  • Advanced: Add disabled class for QueryResultItem in trial mode

  • NoDatabase: Fixed issue with activating license

  • Include more information when setting of a reference attribute fails

  • Client: include original exception when PostJson fails

  • Don't show proxy type

  • NoDatabase: Fixed issue with GroupBuilder and NoDatabase

  • Websites: Fixed issue with calling GetClientData directly

  • Added extra rules when working with Security PO

  • Don't show New action on Persistent Object -> Rights tab when ReadOnly

  • Less dependency on System.Web (OWIN compatible)

  • Fixed some issues in reports

  • Fixed NRE when using http/2 server push

  • Don't log invalid username/pass if logs are disabled

  • Builder: Fixed issue when NuGet package was not restored yet
    Always use the correct protocol for the Google font
  • Added option to keep model hashes in separate file

  • Improved resolving of custom api methods on SchemaWeb class (allow query in uri)

  • Re-activate license after synchronize

  • Changed default WebControllerModule behavior to load Web2 if found

  • Monitor websites.json for changes and update in-memory model
  • Added queries to website pages

  • Added static file serving for websites

  • Read website and page contents from disk during development

  • Handle querying of user inherited rights
  • Handle creating new user right on existing user/group

  • Fixed issue with not being able to delete queries anymore
  • Fixed text search issue when POA labels ends with questionmark

  • Fixed issue with verbose logging when the TargetContextType contained invalid characters

  • Fixed retrying of initialization when failed on startup

  • Tweaked default DisableBulkEdit logic
  • Make sure we register longer binding paths first to allow putting websites in subfolders of existing websites

  • Added option to hook into ExportToExcel functionality

  • Client: Added async method to wait for setting attribute value with TriggersRefresh

  • Fixed typo, fixed issue when sheetname is too long

  • Use new Group/Tab's name as label if label is empty

  • Include hostName if different in failed sign in log

  • Handle Loading/Saving of settings

  • Also save security settings correctly for NoDatabase mode

  • Enable Advanced flags from AppSettings

  • Don't filter PU's items in Management based on Filter method

  • Don't allow adding detail query with the same name

  • Don't persist "" to json files

  • Refactored logic to get all groups for all users in one batch operation

  • Added ability to specify custom sort expression for POA

  • Skip cache updates that have been processed already

  • Added ability to use other queries for AddReference behavior

  • Use name instead of query instance for AddReference

  • Expose GetDeterministicGuid extension method

  • Show DisplayAttribute/LookupAttribute on Attributes query and allow filter

  • Added Advanced.SynchronizeOptions to tweak default synchronize behavior

  • Show POA.SortExpression in management

  • Fixed issues when target context uses base type

  • Fixed issues when target context uses base type in different assembly

  • Don't show New button on PUI's Query

  • Added extra functionality to Builder to get all POs/DataTypes/...

  • Don't run synchronize schema when json repository is read-only

  • Fixed issue with Enum/FlagsEnum properties being added as "String"

  • Advanced: Added PostSynchronize hook

  • Moved Query's PO attribute in front of Source

  • Try to use a minimal of offset updates when reordering an Int32 property

  • Added ability to add query directly to PU

  • Don't fail on Profiler.Current giving exception when calling ExceptionService.Log

  • Make sure Vidyano repository is initialized before mapping vidyano routes

  • Fixed QueryFilters for users without UserSettings

  • Added extra safety checks for website deletes

  • Fixed issue with website file deletes triggered by ReplaceIfExists

  • Fixed website and website page labels when adding new

  • Websites: Fixed issue when assigning bindings for the first time

  • Websites: Fixed issue when app is hosted in subfolder

  • Websites: Allow website without pages

  • Prefer HostingEnvironment over HttpRuntime

  • Fixed FlagsEnum distincts issue when underlying type is not int

  • Added ability to filter dates on hour as well

  • Fixed issue with ValidationException not formatting the message

  • Lock on currentList when adding or removing claims

  • Updated dependencies (CommonMark, Microsoft.WindowsAzure.ConfigurationManager, Newtonsoft.Json)

  • Added paper element to websites test

  • Updated Vidyano Web²

  • Added missing md pages

  • Ensure consistent ordering for website pages before save

  • Show logged url from feedback as notification (and hide screenshot if empty)
  • Make sure LogVerboseData PO uses whole width

  • Tweaked navigation behavior to only see as fromAction when a parent exists

  • Fixed retrying of initialization when failed on startup

  • Reduced time to 15 seconds (from 30)

  • Removed unneeded system message

  • Ensure cached HasGlobalSearch is updated

  • Default minimum IE version incremented to 10 (still supports 9)

  • Handle missing Vidyano connection string

  • Added missing parameter validations inside Manager public methods

  • Improved error messages when query's source is not found

  • Changed Report XSD generation to include more details about model (extra types, required, max length, …)

  • Allow User/NullableUser for string properties

  • Changed Report to also allow Accept header for content-type (application/json, text/xml or text/csv)

  • Prefer DbContext.SaveChanges directly for PersistChanges

  • Skip removing rights when deleting user on a read-only repository (user is still deleted but we keep orphaned rights)

  • Fixed issue when importing patch

    Expose WebsiteArgs.ResponseHeaders/HttpStatusCode

  • Allow custom SqlErrors (error number >= 5000) to be shown to the end-user

  • Verify two-factor code after validating password

  • Improved cleaning up vidyano logs (allows usage of index on DB)

  • Don’t get computed attribute value for IsNew PO when attribute doesn’t have New visibility

  • Expose IBuilder.GetPersistentObject/GetQuery (returns null if it doesn’t exists yet)

  • Allow CustomActions classes to be discoved in a different namespace

  • Changed the Security page to be more compact using a single Authentication Providers attribute

  • Disabled sliding expiration on auth tokens by default, old behavior can be enabled using the Vidyano.SlidingAuthToken app setting

  • Made email sending part of Feedback asynchronous
  • Don’t allow Impersonate for Groups

  • ActionLabelsarrow-up-right
    Convert Language to ILookupKeyValueData
    Reliable async messaging
    Major performance improvement for bulk operations
    Show tooltip for locked settings
    Missing dialog translations
  • Prefer User Name instead of DisplayName in logs

  • Fixed bulk construct on POA/PUI/Settings using disposed actions
  • Fixed POA.Actions implementation

  • Courier
    Courier Enhancements
    Courier Messaging System
    Group/Tab: Indicates which group or tab the attribute belongs to.
  • Label: A translatable label for user-friendly display.

  • Business Rules: Associated validation rules.

  • Multivalue String: Allows users to enter multiple lines of text that can be reordered.
  • Combobox and Dropdowns: Enables selection from a predefined list, with options to add new values.

  • IsEmail: Validates if the input is a properly formatted email address.
    argument, providing various request details.
  • Standard ASP.NET Core: Use the standard IResult interface for returning results, compatible with ASP.NET Core helper methods.

  • View Preferences: Configuring how persistent objects are displayed, such as master-detail or full-page views.

  • Custom Settings: Developers can create and manage custom settings, which can be fetched and set via code. These settings are environment-specific, allowing different configurations for production, staging, and development environments.

  • Updateable Logs: Supports appending to logs during long-running processes, allowing continuous tracking and insight into process execution.

    Group Membership: Determines user group memberships and supports various authentication customizations, including header-based authentication.
  • Custom Contexts: Developers can implement their own Context classes if needed.

  • Actions classes
    Overriding Vidyano Settings
    verbose logging
    Azure AD SAML based authentication.
    Courier Feature
    https://github.com/Vidyano/vidyanoarrow-up-right
    https://github.com/2sky/VidyanoRavenSamplearrow-up-right
    public partial class ProductActions
    {
        public IQueryable<Product> ActiveProducts(CustomQueryArgs args)
        {
            return Context.Products.Where(p => p.IsActive);
        }
    }
    // No arguments, rule can be used as "NotEmpty"
    public static string? NotEmpty(BusinessRulesArgs args, string value)
    {
        if (string.IsNullOrWhiteSpace(value))
            return "{0} cannot be empty.";
    
        return null;
    }
    
    // With arguments, rule can be used as "Between(0, 100)"
    public static string? Between(BusinessRulesArgs args, decimal value, decimal min, decimal max)
    {
        if (value < min || value > max)
            return "{0} must be between {1} and {2}.";
        return null;
    }
    public partial class Import : CustomAction<ProjectTargetContextType>
    {
        public override PersistentObject Execute(CustomActionArgs e)
        {
            return Manager.Current.RegisterImport(e.Query?.PersistentObject ?? e.Parent!, accept: ".xlsx");
        }
    }
    
    public partial class EmployeeActions
    {
        public override void OnImport(ImportArgs e)
        {
            var sheet = e.ReadAsExcelSheet();
        }
    }
    [Description("""
               Allows to download a file from the server.
               """)]
    public partial class Download : CustomAction<ProjectTargetContextType>
    {
        /// <inheritdoc />
        public override PersistentObject Execute(CustomActionArgs e)
        {
            e.EnsureParent(Types.Employee);
    
            // This will inform Vidyano to call the OnGetStream method on EmployeeActions.
            return Manager.Current.RegisterStream(e.Parent);
        }
    }
    
    public partial class EmployeeActions
    {
        public override Stream OnGetStream(GetStreamArgs e)
        {
            return e.GetText(e.Key, "Employee.txt");
        }
    }
    public IResult Ping(ApiArgs args)
    {
        return Results.NoContent();
    }
    // Get a setting
    var enabled = Manager.Current.GetSetting("FlagEnabled", false);
    var retries = Manager.Current.GetSetting("NumberOfRetries", 5);
    var url = Manager.Current.GetSetting("ExternalUrl", "https://service/api/");
    
    // Set a setting
    Manager.Current.SetSetting("LastSync", Manager.Current.NowOffset);
    // Log an exception with detail information
    ServiceLocator.GetService<IExceptionService>().Log(ex);
    
    // Or as a warning
    ServiceLocator.GetService<IExceptionService>().LogWarning(ex);
    
    // Logged exceptions will contain:
    // - Message/Type/Source
    // - Data
    // - All inner exceptions recursively
    // Log
    Manager.Current.Log("Message", LogType.Information);
    // Will also log the User that was currently logged in
    // For background jobs we can pass any user
    Manager.Current.Log("Job failed", LogType.Error, adminUser);
    // Updateable log
    using var log = Manager.Current.UpdateableLog("Message", LogType.Custom);
    // do some processing
    log.AppendLine("Extra information");
    log.ChangeType(LogType.Warning);
    log.Prepend("Finished at ..."); // Makes it easy in the Logs view to see this part
    log.Delete(); // if the log isn't relevant you could clean it up
    /// <summary>Describes the type of logging.</summary>
    public enum LogType : byte
    {
      /// <summary>An error has occurred.</summary>
      Error,
      /// <summary>The synchronization process has logged something.</summary>
      Synchronization,
      /// <summary>A security related entry has been logged.</summary>
      Security,
      /// <summary>A custom entry has been logged.</summary>
      Custom,
      /// <summary>A warning entry has been logged.</summary>
      Warning,
      /// <summary>An information entry has been logged.</summary>
      Information,
      /// <summary>A licensing entry has been logged (Legacy).</summary>
      Licensing,
    }
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=es6"></script>
    tsconfig.json
    {
      "compilerOptions": {
        "lib": [
          "dom",
          "es2015"
        ],
        ...
    <script src="web2/Libs/linqjs/linq.min.js"></script>
    // Array.from for DOM NodeList
    Array.from(this.querySelectorAll(".item")).forEach(item => ...
    // distinct
    arr.distinct<T, U>( selector?: (element: T) => T | U): T[];
    
    // groupBy
    arr.groupBy<T>(selector: (element: T) => string): KeyValuePair<string, T[]>[];
    arr.groupBy<T>(selector: (element: T) => number): KeyValuePair<number, T[]>[];
    
    // orderBy
    arr.orderBy<T>(selector: (element: T) => number | string): T[];
    arr.orderBy<T>(property: string): T[];
    
    // orderByDescending
    arr.orderByDescending<T>(selector: (element: T) => number): T[];
    arr.orderByDescending<T>(property: string): T[];
    
    // min
    arr.min<T>(selector: (element: T) => number): number;
    
    // max
    arr.max<T>(selector: (element: T) => number): number;
    
    // sum
    arr.sum<T>(selector: (element: T) => number): number;
    // E.g. select all detailLines from lines
    [].concat(...this.lines.map(d => d.detailLines))
    JwtHS256Key (via the Vidyano:JwtHS256Key app setting)
    Configure TLS 1.2 to be the minimum TLS version
  • Disable the admin user and use another named user that is an administrator or make sure that the password is strong (and different from development)

  • VeryStrict

    30

    10

    Public APIs

    Standard response headers - X-RateLimit-Limit and X-RateLimit-Remaining

    Relaxed

    500

    200

    Development, internal tools

    Moderate

    120

    60

    Default - recommended for production

    Strict

    60

    30

    Microsoft.Extensions.Caching.StackExchangeRedisarrow-up-right
    here (2023)arrow-up-right
    here (2018)arrow-up-right
    here (2014)arrow-up-right

    High-security environments

    NuGet packagesarrow-up-right
    arrow-up-right
    arrow-up-right
    arrow-up-right
    arrow-up-right
    function Get-SecureRandomString {
        param(
            [int]$Length = 32
        )
    
        $bytes = New-Object byte[] $Length
        $rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
        $rng.GetBytes($bytes)
        $rng.Dispose()
    
        $base64 = [Convert]::ToBase64String($bytes)
        return $base64.Replace('+', '-').Replace('/', '_').TrimEnd('=')
    }
    
    Write-Host '"ApplicationSalt": "' -NoNewline
    Write-Host (Get-SecureRandomString -Length 40) -NoNewline -ForegroundColor Green
    Write-Host '",'
    
    Write-Host '"DiagnosticsToken": "' -NoNewline
    Write-Host (Get-SecureRandomString -Length 40) -NoNewline -ForegroundColor Green
    Write-Host '",'
    
    Write-Host '"ObjectIdsSalt": "' -NoNewline
    Write-Host (Get-SecureRandomString -Length 40) -NoNewline -ForegroundColor Green
    Write-Host '",'
    
    Write-Host '"JwtHS256Key": "' -NoNewline
    Write-Host (Get-SecureRandomString -Length 32) -NoNewline -ForegroundColor Green
    Write-Host '"'
    {
      "Vidyano": {
        "CookieBasedAuthentication": true
      }
    }
    {
      "Vidyano": {
        "EnableRateLimiting": true
      }
    }
    {
      "Vidyano": {
        "EnableRateLimiting": true,
        "RateLimitLevel": "Strict"  // Optional: defaults to "Moderate"
      }
    }
    // In Program.cs
    builder.Services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = builder.Configuration.GetConnectionString("Redis");
    });
    builder.Services.AddDistributedSqlServerCache(options =>
    {
        options.ConnectionString = builder.Configuration.GetConnectionString("DefaultConnection");
        options.SchemaName = "dbo";
        options.TableName = "Cache";
    });
    // In [Schema]Web.cs
    public override void GetWebsiteContent(WebsiteArgs args)
    {
        args.ResponseHeaders.Append("X-Xss-Protection", "1; mode=block");
        args.ResponseHeaders.Append("Referrer-Policy", "same-origin");
        args.ResponseHeaders.Append("Strict-Transport-Security", "max-age=63072000");
    
        // Disable unnecessary browser features to reduce attack surface
        args.ResponseHeaders.Append("Permissions-Policy", "camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()");
            
        base.GetWebsiteContent(args);
    }
    mkdir VidyanoSample
    cd VidyanoSample
    dotnet new vidyano
    Nuget Version
    Nuget Version
    Nuget Version
    Nuget Version

    Architecture

    Note: This documentation has been updated for v6. Please refer to the v6 Security - Architecture documentation for the latest information.

    hashtag
    Groups / Rights

    Functionality is driven by giving groups (application roles) specific rights to actions (e.g. Save, New, Delete, Print, Export, …). Without an explicit right for an action the user won’t be able to execute the action and the backend will throw an exception.

    Query, Read, Edit and New rights can be defined at the attribute (property/column) level, all other actions can be defined at the persistent object (class/table) level.

    hashtag
    Authentication

    Vidyano application can be configured to allow multiple authentication sources which all map to users that can be assigned to groups.

    hashtag
    Vidyano Authentication

    Enabled by default, allows the usage of any custom name and password to log in. Passwords are stored in the database using a BCrypt hash. The BCrypt complexity can be configured and is increased by the framework on regular intervals (currently at 13). Will require a password with at least a length of 8 and it should not be in the blacklist (currently a list of the top 25 worst passwords and Pwned Passwords using the V2 range API), can be configured to use a different length, complexity (no longer recommended) or a different blacklist.

    Password requirements are based on and

    The service is used to validate that passwords don’t appear on any leaked password list. The new V2 api is used with the Range API to provide k-anonymity to check for breached password without disclosing the actual password (or even a full hash of it).

    hashtag
    ADFS Authentication

    Allows the use of an Active Directory Federation Service to authenticate the user in the application. The application can be configured to automatically put unknown authenticated users in specific group or this logic can be handled using code (to put the user in a specific group based on the returned claims). Will use the http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname claim as user name.

    hashtag
    OAuth Authentication Providers

    Allows the use of an OAuth provider (Microsoft, Google, Facebook, Twitter or Yammer) to authenticate the user in the application. Can also be configured to automatically create unknown users. Will use the email as user name.

    Auth Token\

    Once the user has been authenticated the server will return an auth token to the client that can be used for the next requests.

    The token is a SHA256 hash composed of the following information:

    • Application salt

    • User name

    • User version (incremental number in the database that is increased when the password is changed or the user is disabled)

    The actual IP address to check can be configured to allow switching between addresses within a specific cidr range in case the users have multiple external IP address or it can be changed using code.

    hashtag
    Security Token

    To ensure that the client works with the correct model (based on the rights) the server will generate a security token that can be checked when the persistent object is send back.

    The token is a SHA256 hash composed using the following code:

    The token uses a random salt to prevent any oracle attacks. All information is included so that the client can only modify the entity as it was sent by the server with only the attributes that were available. For attributes that the user has no edit rights the actual value is also used in the token so that the application can securely set these attributes on the server-side. Trying to modify any of the data will result in an exception being thrown by the backend.

    \

    hashtag
    Force Https / TLS 1.2

    Vidyano will automatically redirect to https:// for certain subdomains (azurewebsites.net, apphb.com, …) and can be configured with a simple appSetting for custom domains. Enabling this flag will also enable HSTS (Strict Transport Security) which tells the browser to always go the https:// site directly even if the user tries to go to http:// to block MITM attacks.

    Depending on the deployment it is recommended to only allow TLS 1.2 if possible. This can be enabled for Microsoft Azure App Services on the SSL settings tab:

    hashtag
    Two-factor authentication

    Each user can set its own two-factor code on the user settings page (available using the gear in the lower left of the application). The application can also be configured to require (force) two-factor authentication for users that are in a specific group (e.g. Administrators).\

    Expiry date and time
  • IP address

  • Optionally the original user when an user is impersonated

  • Microsoft’s Password Guidancearrow-up-right
    NIST’s Digital Identity Guidelinesarrow-up-right
    https://haveibeenpwned.com/Passwordsarrow-up-right
    public override string GetClientIpAddress(string userName, string ipAddress)
    {
        if (userName == "salesguy") // NOTE: Always on the road
            return Manager.Current.GetUser(userName).Profile["AuthTokenSalt"];
    
        return base.GetClientIpAddress(userName, ipAddress);
    }
    private string GetTamperingDetectionToken(string securityToken)
    {
        string salt;
        if (securityToken == null)
            salt = ObjectEx.GetSecureRandomString(6);
        else
            salt = securityToken.Substring(1, 8);
    
        var allData = new StringBuilder();
        allData.AppendLine(salt);
        var poSalt = VidyanoDbCache.Default.GetPersistentObject(Id, false)?.Salt;
        if (poSalt != null)
            allData.AppendLine(poSalt);
        allData.AppendLine(Id.ToString());
        allData.AppendLine(ObjectId);
        if (BulkObjectIds != null)
            BulkObjectIds.Run(id => allData.AppendLine(id));
    
        Attributes.OrderBy(a => a.Id).Run(attr =>
        {
            allData.AppendLine(attr.Id.ToString());
            if (attr.IsReadOnly && !attr.Name.Contains("."))
            {
                var attrWithReference = attr as PersistentObjectAttributeWithReference;
                allData.AppendLine(attrWithReference != null ? attrWithReference.ObjectId : attr.Value);
                allData.Append(attr.IsValueChanged);
                allData.AppendLine();
            }
        });
    
        allData.AppendLine(SecurityScope.ApplicationSalt);
        var result = allData.ToString().GetSHA256();
        return "$" + salt + result;
    }
    GitHub Tag

    Changelog 2014

    hashtag
    December 2014

    hashtag
    New Features

    hashtag
    Unit Testing

    • Added Vidyano unit tests

    • Renamed Service to Client for better clarity

    hashtag
    Translation Export/Import

    • Added Export/Import functionality for translations

    • Allows easier localization management

    • Uses DataExport icon

    hashtag
    Fixes

    • Fixed issue with StackedAreaChart

    • Fixed issue with BinaryFile on OpenAsDialog

    • Ignore NullReferenceException on System.Web's AssociateWithCurrentThread

    hashtag
    Maintenance

    • Made OnImport methods public

    • Allow OK/Notice/Warning notifications on OpenAsDialog Save (shows on query)

    • Allow RegisterStream with null as key

    hashtag
    November 2014

    hashtag
    New Features

    hashtag
    Dynamics System

    • Full dynamic schema implementation released

    • Show in management (Advanced -> Dynamics)

    • Allow New/Delete from management

    hashtag
    Diagnostics

    • Added comprehensive diagnostics functionality

    • Better insight into system behavior

    hashtag
    OpenAsDialog State

    • Added StateBehavior OpenAsDialog

    • Web: Added PersistentObject.openAsDialog support

    • Better dialog management

    hashtag
    Fixes

    • Fixed issue with OpenAsDialog and ComboBox

    • Fixed issue with optimize select

    • Fixed issues with Session setting

    hashtag
    Maintenance

    • Changed Export to Excel to ignore trimming on text columns

    • Include max users information on License PO

    • Performance fix when saving UserSettings

    hashtag
    October 2014

    hashtag
    New Features

    hashtag
    Dynamic Schemas

    • Complete Dynamic Schema implementation

    • DynamicCollection/DynamicCollectionProperty Persistent Objects

    • Dynamic schema administration groups ([Schema]_Admin)

    hashtag
    Data Types

    • Added User/NullableUser data types

    • Added CommonMark data type support

    • Added DataTypeBuilder

    hashtag
    Advanced Hooks

    • Allow custom queries on POActions

    • Allow open generic (TEntity) POActions

    hashtag
    Fixes

    • Fixed exception when dynamic CreatedBy attributes don't exist

    • Fixed issue where a dynamic schema could not be deleted

    • Fixed issue with WebControllerLogger invoking before SchemaSynchronizer

    hashtag
    Maintenance

    • Changed OptimizeSelect to opt-out

    • Added filter and sorting client messages for Vidyano Web2

    • Changed Settings to show difference between Vidyano and custom settings

    hashtag
    September 2014

    hashtag
    New Features

    hashtag
    Environment Version

    • Added EnvironmentVersion support

    • Better version management

    hashtag
    TranslatedString Enhancements

    • Changed TranslatedString behavior

    • Added NotificationType.Warning

    • Allow Image to be changed to BinaryFile

    hashtag
    Fixes

    • Fixed issue with columnCount not working anymore on Tabs

    • Fixed issue with Session PO showing json label on Settings

    • Fixed issue with PO.Save not restoring global flag

    hashtag
    Maintenance

    • Don't add query item count for global search in web v2

    • Added ability to use original value in QueryExecuted's QueryResultItemValues

    • Updated NuGet packages

    hashtag
    August 2014

    hashtag
    New Features

    hashtag
    GroupingInfo

    • Added GroupingInfo support

    • Better query result grouping

    hashtag
    Fixes

    • Fixed merge issue

    • Fixed issue when Sort changed from IQueryable to IEnumerable

    hashtag
    Maintenance

    • Added readonly/disabled QueryResultItem type hint

    • Updated WebAPI to 5.2

    • Updated OData to 5.6.2

    • Updated JSON to 6.0.4

    hashtag
    July 2014

    hashtag
    New Features

    hashtag
    Word Compatibility

    • Customize Word compatibility

    • Better document generation

    hashtag
    User Management

    • Expose User.UpdateLastLoginDate

    • Added ability to check if group exists

    hashtag
    Fixes

    • Fixed typo in NullableBoolean template

    • Fixed issue with GetQuery failing if system query with same name exists

    • Fixed boolean in attribute as detail

    hashtag
    Maintenance

    • Updated Core packages

    • Ignore X-Frame-Options header for ExecuteAction/GetStream

    • Don't use verbose log for Performance call

    hashtag
    June 2014

    hashtag
    New Features

    hashtag
    Performance Data

    • Expose Performance data

    • Better performance monitoring

    hashtag
    Charts Enhancements

    • Allow LineChart grouped on DateTime and string

    • Better chart flexibility

    hashtag
    Fixes

    • Fixed focus issue on sign in page

    • Fixed issue with DisableSort not being checked when looking for default SortOptions

    • Fixed issue with cloned attributes without data type

    hashtag
    Maintenance

    • Bye bye WPF - removed WPF support

    • Improved handling of DataTypes on POA

    • Fixed tests

    • Updated libraries

    hashtag
    May 2014

    hashtag
    New Features

    hashtag
    Advanced Search

    • First implementation for advanced search

    • Better search capabilities

    hashtag
    Word V2 Templates

    • Added Word v2 templates

    • Improved document generation

    hashtag
    MessageBuilder

    • Added MessageBuilder

    • Added CustomActionBuilder

    hashtag
    Fixes

    • Fixed issue with w15 databindings not being checked

    • Fixed issue with ACS not showing errors

    • Fixed issue with PO staying in isNew after save

    hashtag
    Maintenance

    • Correctly remove all content blocks

    • Make sure all document parts are checking for data bindings

    • Allow MultiLine translated string

    hashtag
    April 2014

    hashtag
    New Features

    hashtag
    PersistentObjectAttributeAsDetail

    • Added PersistentObjectAttributeAsDetail definition

    • Better detail attribute handling

    hashtag
    Fixes

    • Fixed issue with bulk edit on POA not showing extra attributes

    • Fixed issue with table storage throwing 404 when entry is already deleted

    • Fixed issue with reports

    hashtag
    Maintenance

    • Updated NuGet packages

    • Updated Open XML SDK (2.5)

    • Code cleanup

    • Force https for azurewebsites.net/apphb.com if not set

    hashtag
    March 2014

    hashtag
    New Features

    hashtag
    Security Enhancements

    • Added configurable password complexity system

    • Added image file upload validation

    • Added safer underscore values to templates

    hashtag
    Verbose Logging

    • Complete verbose logging implementation

    • Added verbose logging query

    • Added verbose logging data object

    hashtag
    Vidyano Mobile Client

    • Added Vidyano JQuery Mobile Client

    • Added BackBone & Underscore support

    • Added page navigation parameters

    hashtag
    Charts

    • Added MultiChart

    • Handle valueFormat option for all charts

    hashtag
    Fixes

    • Fixed issue with 'Invalid user name or password' not showing

    • Fixed Poll call not working

    • Fixed issue with custom queries that return an array

    hashtag
    Maintenance

    • Always delay user/password check by 1-2s

    • Don't send profiler on exception

    • Don't log Poll calls

    • Fixed logout on cross-browser tabs

    hashtag
    February 2014

    hashtag
    New Features

    hashtag
    Charts System

    • Complete charts implementation

    • Added bar chart, line chart, treemap

    • Added NVD3 charts integration

    hashtag
    DynamicEngine

    • Added DynamicEngine

    • Fixed DynamicEngine GetGlobalValue/SetGlobalValue issue

    hashtag
    Fixes

    • Fixed sorting issue when using anonymous type

    • Fixed EF6 sorting issues

    • Fixed Jurassic issues

    • Fixed LineChart GroupBy on enumerable sources

    hashtag
    Maintenance

    • Updated hashing to bcrypt(10)

    • Added parseJSON function

    • Added Sort hook

    • Copied Jurassic xml documentation

    hashtag
    January 2014

    hashtag
    New Features

    hashtag
    Query Enhancements

    • Added charts on Query

    • Added inherited rights on users/groups

    • Added optional Query argument for Find/GetEntity

    hashtag
    Fixes

    • Fixed synchronize for poa's with name that is not identical with context property name

    • Fixed issue with get unknown message for specific language

    • Fixed Next & Previous icon alignments

    hashtag
    Maintenance

    • Updated to WebApi 2.1 (5.1)

    • Added groupname on persistent object attribute clone

    • Auto-apply text search filter based on propertyType


    Note: 2014 was a transformative year with 280 commits introducing the Dynamic Schemas system, comprehensive charts functionality, verbose logging, password complexity management, Vidyano Mobile Client, and the beginning of the transition away from WPF support.

    Show Collections/Security queries on DynamicSchema
  • Allow configuring of Security on DynamicSchema

  • Added default PersistentObject actions class for Dynamics (DefaultPersistentObjectActions`1)

  • Fixed issues with Impersonate when translation failed
  • Fixed issue with changes being made to User using Management

  • Fixed issue with tooltips on dialogs leaving invisible DOM elements behind

  • Fixed issue with SelectReferenceDialog modifying all open jQuery dialogs

  • Fixed caching issue after creating new dynamic schema

  • Fixed issue with EF6 handling transactions differently

  • Show Impersonate inline on Users
  • Added LastLogins/NewUsers chart on Users

  • Allow delete property on dynamic collections from code

  • Added createIfNotExists to GetOrCreateSchema method on public interface

  • Allow custom dynamic queries

  • Added favicon

  • Added Vidyano repository unique constraints

  • Changed NotEmpty rule to check current language for TranslatedString

  • Web: Include inline selectedItems for execute hook

  • Web: Fixed styling issue with input[type=password]

  • Data security to Dynamics
  • Validation logic for dynamic entities

  • Auditing and soft delete support

  • Fixed issue with duplicate group names
  • Fixed translated string issue on messages

  • Fixed issue with EF6 already optimizing joins

  • Fixed Chrome for Android scrolling issue on QueryGrid

  • Fixed viSearch issue when using double condition on entity

  • Fixed DateTimeOffset issue

  • Fixed issue with EF6

  • Fixed issue with using projected EF types

  • Ensure valid DynamicCollection/Property names
  • Don't add client routes for dynamic persistent objects

  • Added transaction support over DynamicCollection/Property deletes

  • Don't filter auditing and soft delete data for schema_Admin users

  • Moved auditing and soft delete data to separate tab/groups

  • Only expose correct attributes for PO/POA based on dynamic

  • Cache Schema.IsDynamic

  • Ensure correct TargetContext for ExecuteQuery

  • Expose various StringEx methods

  • Updated NuGet packages

  • Expose userCulture/userLanguage

  • Changed select optimizer to opt-in (Vidyano.EnableOptimizeSelect)

  • Log actual GetObjects (SQL + materialize)

  • Handle double conditions on viSearch

  • Ignore unsaved changes if po has no Save/EndEdit action

  • Show notification for unsaved changes on CancelEdit/CancelSave

  • Added Optimize Select feature

  • Expose some helper methods for handling Sort

  • Allow Key attribute on primary key properties

  • Force v5 to use .NET 4.5

  • Improved text search on bool, numeric, and KeyValueList

  • Show expires info on License PO

  • Hide trial notification after activation

  • Added option to request trial key

  • Added api methods (available from /api/methodName)

  • Added required for Remaining- and MatchingDistincts attribute

  • Web: changed confirmation for unsaved changes on CancelSave/CancelEdit to opt-in

  • Web: consistent behavior for PU's and openFirst

  • Web: tweaked position of labels and input

  • Fixed BulkEdit issue on system PO's with TranslatedString
    Consistent NuGet packages
  • Fixed edmx warning

  • TypeScript definitions update

  • Tweaked VidyanoDbCache to use locking instead of ConcurrentDictionary

  • Make sure SelectInPlace uses the DisplayAttribute for sorting

  • Updated WindowsAzure.Storage to version 4.2

  • Fixed AdvancedSearch issue
  • Fixed issue with TriggersRefresh

  • Fixed issue with Word template

  • Fixed issue with sorting on Dynamic

  • Fixed QueryGrid sometimes not showing bottom row

  • Fixed Flags enum box with empty value

  • Fixed KeyValueList issue

  • Added IndexHtml to CustomWebController
  • Removed old WPF test project

  • Fixed null check in showNotification
  • Fixed issue with CancelEdit only working once for StayInEdit

  • Fixed issue with eg Object tampering being thrown during ExecuteAction

  • Fixed issue when synchronize creating duplicate PO's

  • Fixed issue when Logging exception before initializing logic is executed

  • Fixed NRE for textSearch on virtual property

  • Fixed issue with missing result hook for PO

  • Fixed issue with accent colors

  • Updated WindowsAzure.Storage to version 4.0.1

  • Updated EntityFramework to version 6.1.1

  • Removed some obsolete code

  • Don't show ACS exception information to end user

  • Make sure cache is updated when using Manager.CreateForUser

  • Added ellapsed milliseconds to verbose logging

  • Correctly handle added/removed attributes during refreshFromResult

  • Added count to spinner to prevent premature spinner removals

  • Call onError when onCompleted throws an exception in ExecuteAction

  • Added HasPersistentObject/HasQuery methods IBuilder

  • Show client error if refreshFromResult is called with wrong PO

  • Added ObjectTamperingDetection helper

  • Expose Parent on QueryExecutedArgs

  • Show messages with invalid format

  • Allow data filter/text search with non-existing properties

  • Changed QueryResultItemValue.displayValue to be both function and string

  • Changed luminance to +25% for light accent color

  • Fixed typo in message

  • Ignore columns that can't be filtered

  • Updated crawler handler with more image types

  • Changed behavior when getPersistentObject returns a notification and notificationType is "Error"

  • Fixed memory leak in resize
  • Fixed Word issue

  • Fixed repeating sections issue in Word template

  • Fixed issue with user rights being added twice

  • Added option to strip unused xml from custom xml part
  • Added Base64 rule on ACS symmetric key

  • Removed ClientEnvironment.Desktop

  • Removed WPF templates/icons

  • Fixed missing query right on Vidyano.SearchObject

  • Use TextSearch for AdvancedSearch

  • Added extra hooks for GetDistinctValues

  • Made extra hooks visible

  • Added Initialize hook on any PersistentObjectActions implementation

  • Only call Initialize after cache is loaded

  • Added Retry button to Error page

  • Cleanup references to query resultContainer and charsContainer (leakage)

  • Added total time spent on SQL Statements to profiler view

  • Fixed issue with log verbose not matching parent
  • Fixed issue with reference having displayattribute with dot not working for textsearch

  • Fixed submenu on IE touch

  • Fixed issue with filtering on reference attributes

  • Fixed typo in AuthenticatorService.GetFriendlyUserName method

  • Fixed issue with UserSession.Dispose when called

  • Correctly generate urls for web scraper

  • Include ContentDisposition header for IO7 or higher

  • Call registerInput on detail attribute's parent

  • Use same logic for ACS when user can't log in (i.e. show HTML error)

  • Added hook on CustomWebController to override error page

  • Remove server and asp.net headers
  • Added x-frame-options = sameorigin

  • Added x-content-type-options = nosniff

  • Added basic text filtering on LogVerbose
  • Added reference searching on LogVerbose

  • Added retry for failed LogVerbose entries (max 10)

  • Use Log Retention settings for WebControllerLogger

  • Added WebControllerLogging to Windows Azure

  • Compress verbose logs

  • Added Query Page
  • Added PersistentObject Page

  • Added flipswitch

  • Added attribute hooking

  • Added save button

  • Fixed query filter stay open
  • Fixed issue with virtual Messages/Settings showing in Management

  • Fixed issue with $.cookie

  • Don't leak UserName to Google Analytics

  • Use correct way of transforming web.config file

  • Fixed TypeScript issue when building Vidyano 4.5

  • Strip password from incoming data in GetApplication

  • Removed obsolete IE8 utf8 fix

  • Made CustomQueryArgs parameter optional on custom queries

  • Added method to update PO's attributes from ClrType

  • Never send unmapped properties to EF query

  • Fixed invalid NotMapped check

  • Updated to EF6.1

  • Tweaked locking behavior for cache updates

  • Sleep 4 hours instead of 1 minute for deleting old verbose logs

  • Added disabled as placeholder for VidyanoLogging

  • Give link to actual Log message when synchronizing

  • Force password complexity (CreateNewUser/ChangePassword/...)

  • Correctly call VidyanoDbCache instead of Manager.Current when possible

  • Updated NuGet.exe to 2.8

  • Added Vidyano.LoggingExcludedUserIds

  • Added Vidyano.LoggingExcludedVidyanoMethods

  • Added logging of Vidyano version

  • Don't log verbose for IsSystem

  • Don't show Log (Verbose) if not configured

  • Added assembly binding redirects

  • Fixed code mirror line separator

  • Added template for log verbose data

  • Hide empty attributes on Log Verbose

  • Hide empty columns on Logs verbose

  • Add -vi- class to content for full page queries

  • Changed LogsVerbose WebCode to CSS

  • Added StackedAreaChart
  • Added LineChart with focus

  • Added custom color scale and date/number formats

  • Charts as TypeScript

  • Server-side and client-side chart rendering

  • Chart selector and filters

  • Support for up to 20 values for bar/line charts

  • Added WithCumulativeValues on LineChart

  • Added grouping to LineChart (ByYear, ByMonth, ...)

  • Fixed index checking bug

  • Fixed reflection issue when calculating total

  • Fixed search box disappearing on navigation

  • Fixed chartSelector bug

  • Fixed LineChart when filtering

  • Fixed DataFilter issue on in-memory queries

  • Fixed issue with synchronize when using custom detail query

  • Fixed issue with calls to refresh distincts when adding or removing empty filter column

  • Fixed bug where chart selector is shown on full page layout while not in query mode

  • Fixed issue with having multiple attributes with column in single group

  • Fixed broken merge on POA Clone method

  • Fixed overflow hidden clipping chart tooltips

  • Fixed chart issues on EF6

  • Fixed chart label not being used on rendered chart

  • Fixed chart issues on EF6

  • Added MultiString Web control

  • Show ExecuteQuery notifications on Query

  • Prevent EF6 merge issues

  • Allow customization of Total Item (GetTotalItem method)

  • Correctly verify the chartSelector container is still in reference to the current query

  • Added safety check to chartSelector

  • Pass along parent in ChartArgs

  • Fixed issue with wrong version of d3js

  • Only call OnChart when calling ExecuteQuery with Top is 0

  • Update charts client-side

  • Changed behavior when getting Vidyano objects from cache

  • Removed wl.basic from Microsoft Account OAuth

  • Handle DataTinker license differently (only DataTinker schema is checked)

  • Added overloads to get values for children on BarChart/LineChart

  • Added MultiString data type

  • Added extra operators to POA (to string[], to JObject, to JArray, from string[], from JToken)

  • Fixed issue with data filter not ordering on reference attributes

  • Fixed empty source on Query in some cases

  • Added Vidyano.Service.Charts using on new POActions

  • Added Poll method to WebController

  • Keep enumerables as enumerable when using Where/Select/SelectMany on Source

  • Show exception when sort failed for EnumerableQueryable

  • Improved setting of Total value when using TotalItemArgs

  • Fixed issue with ServiceGateway.fromServiceString not working for unsigned types

  • Moved Vidyano web classes to Vidyano module

  • Improved vidyano.d.ts

  • Updated Vidyano-4.0.d.ts

  • Updated NuGet dependencies

  • Added WindowsAzure.Storage nuget package

  • Fixed profiler issue

  • Consistent API for BarChart/LineChart

  • Added Select/SelectMany on Source

  • Handle elapsedMs on profiler as int

  • Added header to charts

  • Always order line chart on date

  • Moved charts to Charts namespace

  • Updated chart color palette

  • Added TypeScript libraries

  • Opened service side Charts

  • Show bar char x axis

  • Fixed bar chart labels

  • Handle null/empty as name

  • Changed bar to use color

  • Added client bar chart rendering

  • Added filters for bar chart values

  • Finalized bar chart (up to 5 values)

  • Added submenu to chart buttons

  • Fixed data filter stay open

  • Render client side query treemap

  • Fixed data filter for charts

  • Fixed profiler ellapsed milliseconds
  • Fixed issue with Query argument when Query is using another PO (DB View, ...)

  • Fixed datafilter for inherited user actions

  • Fixed NullableBoolean search not working

  • Fixed merge issue

  • Fixed NRE issues

  • Changed New behavior to hide attributes that don't have New right

    Forgot password

    Note: This documentation has been updated for v6. Please refer to the v6 Security - Forgot password documentation for the latest information.

    When working with email addresses as user names we can use this information to provide a forgot password functionality. By implementing the HandleForgotPassword method on the Advanced class you’ll get the “Forgot password?” button on the Sign in screen.

    Best practice recommends for generating a random reset password token (ObjectEx.GetSecureRandomPassword can be used), storing the token in the user profile, emailing the user a link that triggers an api method that will verify the token and user combination. At that moment you can use the IUser.ResetPasswordNextLogin() method to trigger a password change on next login and redirecting the user to an existing logged in session.

    // In [Schema]Advanced.cs
    public override void HandleForgotPassword(ForgotPasswordArgs args)
    {
        // NOTE: Always inform for success so that we don't leak information about users
        args.Notification = "An email has been sent with all the information to reset your password.";
    
        var user = Manager.Current.GetUser(args.UserName);
        if (user == null)
            return;
    
        var userHostAddress = Manager.Current.RequestMessage.GetClientIpAddress();
        var token = user.Profile["ResetPasswordToken"];
        if (string.IsNullOrEmpty(token))
        {
            token = ObjectEx.GetSecureRandomString(16).Replace("-", null).Replace("_", null);
            user.Profile.SetValue("ResetPasswordToken", token);
        }
    
        var location = Manager.Current.WebsiteRoot + $"api/ResetPassword?UserName={user.Name}&Token={token}";
        // TODO: Send email to user with information (password change requested, from ip, location to click, ...)
    }
    // In [Schema]Web.cs
    public HttpResponseMessage ResetPassword(ApiArgs args)
    {
        var userName = args.Query["UserName"];
        var token = args.Query["Token"];
        if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(token))
            return args.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid request");
    
        var user = Manager.Current.GetUser(userName);
        if (user != null && token == user.Profile["ResetPasswordToken"])
        {
            user.Profile.SetValue("ResetPasswordToken", null); // NOTE: Resetting the token can be a problem if the user doesn't complete the change password prompt
            user.ResetPasswordNextLogin();
    
            var encodedUser = Convert.ToBase64String(Encoding.UTF8.GetBytes(user.Name)).Replace('/', '_');
            var authToken = WebController.GenerateAuthToken(user.Name, DateTimeOffset.Now.AddDays(28), Manager.Current.RequestMessage.GetClientIpAddress()).Replace('/', '_');
            var response = args.Request.CreateResponse(HttpStatusCode.Redirect);
            response.Headers.Location = new Uri(Manager.Current.WebsiteRoot + "#!/SignInWithToken/" + encodedUser + "/" + authToken);
            return response;
        }
    
        return args.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Invalid request");
    }

    Changelog 2025

    hashtag
    August 2025

    hashtag
    Fixes

    • Fixed Rules handling for string when property is TranslatedString or enum

    • Fixed RavenDB issue where logs couldn't be opened

    • Fixed IsWeb2OrGreater logic to stay in sync with Manager

    hashtag
    Maintenance

    • Updated packages

    • Range indexer usage improvements

    • Documentation updates for authentication

    hashtag
    July 2025

    hashtag
    New Features

    hashtag
    Logging Enhancements

    • Added Manager.GetLog(id) method

    • Direct access to specific log entries by ID

    hashtag
    Fixes

    • Fixed NumberOperationsPattern not allowing != operator

    • Fixed Inherited not showing PO.IsReadOnly correctly

    • Fixed Report to use default preferKeys (bug from June changes)

    hashtag
    Maintenance

    • Updated packages

    • Added CLAUDE.md for AI assistant guidance

    • Documentation improvements (EditorBrowsable, typo fixes)

    hashtag
    June 2025

    hashtag
    New Features

    hashtag
    TranslatedString Enhancements

    • Added TranslatedString.AllowUnknownLanguages

    • More flexible handling of translations for unsupported languages

    hashtag
    API Helpers

    • Added ApiArgs.IsValidToken helper method

    • Simplifies token validation in API methods

    • Pass CancellationToken to custom API methods

    hashtag
    Enhanced Text Search Syntax (#406)

    • Support for has:/no: text search syntax

    • Example: has:email finds records with email, no:phone finds records without phone

    hashtag
    Image Validation (#407)

    • Use magic bytes for image validation

    • More secure and reliable image file type detection

    • Prevents upload of malicious files disguised as images

    hashtag
    Report Improvements

    • Various Report fixes and changes

    • Better handling of report generation and export

    hashtag
    Fixes

    • Fixed issue with /static/ route without extra path

    • Prevented writing status code on already started response

    hashtag
    Maintenance

    • Updated packages

    • Added TextSearch documentation

    • EditorBrowsable attributes for better IntelliSense

    hashtag
    May 2025

    hashtag
    New Features

    hashtag
    EFCORE Configuration Switch (#386)

    • Major update: Switched projects to EFCORE configuration

    • Simplifies Entity Framework Core setup and management

    hashtag
    Advanced Text Search (#394, #396)

    • Added advanced text search functionality

    • Supports complex search queries and patterns

    • More powerful search capabilities across the system

    hashtag
    Month-Day Date Search (#393)

    • Added support for month-day date searching

    • Allows queries like "find all birthdays in March"

    hashtag
    Glossary Support (#326, #395)

    • Added glossary support for property labels

    • Enables consistent terminology across the application

    • Better internationalization support

    hashtag
    Schema Generator (#385, #401)

    • Added ISchemaGenerator<> and JsonSchemaGenerator

    • Automatically generate JSON schemas from your models

    • SchemaGenerator tweaks for improved functionality

    hashtag
    In-Process Courier Invocation (#405)

    • Added in-process courier invocation support

    • Allows direct message handling without external queue

    • Useful for testing and single-instance deployments

    hashtag
    Session Management Improvements

    • Improved user session management

    • Updated session revocation logic to align with sliding authentication token configuration

    • Revokes current auth token by default only when not using sliding sessions

    hashtag
    Culture and Localization

    • Combined fetching of Language/CultureInfo for requests

    • Tweaked default behavior when CultureInfo isn't set

    • Better glossary integration

    hashtag
    Fixes

    • Fixed computed attribute synchronization (#310, #390)

    • Fixed group comment caching on initial start (#388)

    • Fixed issue in SchemaSynchronizer for POAWR from ConsoleOnly

    hashtag
    Maintenance

    • Updated packages

    • Added ServiceLocator extra logic exposed

    • Refactored culture/language handling

    • Added AGENTS instructions for running tests in debug (#404)

    hashtag
    April 2025

    hashtag
    New Features

    hashtag
    ScopedProperties (#384)

    • Added ScopedProperties feature for context-aware property management

    • Allow ScopedProperty as PersistentObjectAttribute DefaultValue

    • Enable Manager.Current properties inside ExpressionParser

    hashtag
    Enhanced Documentation Support

    • Read XML documentation comments for PersistentObject/PersistentObjectAttribute/CustomAction descriptions

    • Initial version to generate llms.txt for AI model consumption

    • Added documentation for PersistentObject properties and enums

    hashtag
    Custom Action Builder Enhancements

    • Expose Intent on CustomActionBuilder

    • Expose GetActionsType on DiscoverProjectInformation

    • Expose IProfiler and various other services via Manager

    hashtag
    User Profile Extensions

    • Added IUserProfile SetValues/HideKey/LockKey methods

    • Provides more control over user profile management

    hashtag
    Expression Parser Improvements

    • Handle IN operator for ExpressionParser

    • Support for more complex query expressions

    hashtag
    Fixes

    • Fixed Excel valid XML characters handling

    • Fixed issue where changing Tab/Group for new POA doesn't work if Advanced hook exists

    • Fixed "can't get interface map for interface type" error

    hashtag
    Maintenance

    • Updated packages

    • Added logos for SqlServer/PostgreSQL/Abstractions packages

    • Added DSL commands documentation

    hashtag
    March 2025

    hashtag
    New Features

    hashtag
    RecordCommands Framework

    • Full RecordCommands support implementation

    • Added custom context support for RecordCommands

    • Enables command pattern for record operations with customizable contexts

    hashtag
    Courier Enqueue Overloads (RavenDB)

    • Added new Enqueue courier overloads for more flexible message handling

    • Provides additional options for message queueing

    hashtag
    Exception Service Enhancements

    • Added IExceptionService.SetTag for better error tracking

    • Allows tagging exceptions with custom metadata

    hashtag
    Breaking Changes

    • BREAKING: Removed QueryType from GenerateIndexAttribute

      • Simplifies index generation by removing the QueryType parameter

      • May require updates to existing code using GenerateIndexAttribute

    hashtag
    Fixes

    • Fixed issue with force write lock when syncing

    • Better handling of loading a single index entity in RavenDB

    • Fixed Linux incompatibilities (#383)

    hashtag
    Maintenance

    • Updated packages to .NET 9.0.3

    • Updated Web3 dependencies

    • Enabled source generator for test projects

    hashtag
    February 2025

    hashtag
    New Features

    hashtag
    Courier Subscription Configuration (RavenDB)

    • Added configuration options for Courier subscription in RavenDB

    • Allows customization of subscription behavior and settings

    hashtag
    RecordCommander Support

    • Added IBuilder tweaks needed for RecordCommander integration

    • Provides better support for command-based record operations

    hashtag
    Fixes

    • Fixed issue preventing reload on New custom action save

    hashtag
    Maintenance

    • Updated NuGet packages

    • Removed support for .NET 7 (no longer supported)

    • Updated copyright year to 2025


    Note: Commits marked with (test) have been excluded from this changelog as they are internal testing commits.

    Changelog 2019

    hashtag
    December 2019

    hashtag
    New Features

    hashtag
    Advanced Search Save/Load (#272, #274)

    • Complete advanced search save/load functionality

    • Persist search configurations

    hashtag
    Fixes

    • Issue when loading Legacy Vidyano application

    • Fixed issue with ExportToExcel not respecting columns

    hashtag
    Maintenance

    • Always include name in ProgramUnitItemGroup based on DefaultLanguage

    • Tweaks and improvements

    hashtag
    November 2019

    hashtag
    New Features

    hashtag
    Persistent Object Enhancements

    • Added PO.KeepValueChanged

    • Keep track of value changes

    hashtag
    Advanced Hooks

    • Added advanced hook to determine friendly filter

    • Better filter customization

    hashtag
    Fixes

    • Fixed issue #273

    • Fixed issue with empty ProgramUnit staying

    • Don't throw when user agent is not found

    hashtag
    October 2019

    hashtag
    New Features

    hashtag
    JWT Enhancements

    • Added JwtPayload support

    • Better JWT token handling

    hashtag
    Query Ordering

    • Added option to explicitly order distinct values

    • Better control over query results

    hashtag
    Repeating Jobs

    • Show extra info for repeating jobs (last execution, execution count)

    • Better job monitoring

    hashtag
    Fixes

    • Fixed issue #270

    • Fixed issue when ContextProperty points to DbQuery

    • Fixed issue with Hasherid not working for EF POCO entity

    hashtag
    Maintenance

    • Detect .NET 4.8

    • Pass targetContext correctly when filtering for load entity

    hashtag
    September 2019

    hashtag
    Fixes

    • Fixed NRE when cdncache.tmp is empty

    hashtag
    August 2019

    No commits in August 2019

    hashtag
    July 2019

    hashtag
    New Features

    hashtag
    Service Actions

    • Added ServiceAction.GroupAction

    • ServiceActionActions improvements

    • Better action organization

    hashtag
    Advanced Search

    • Expose Source.HasAdvancedSearch

    • Keep Source.HasAdvancedSearch for most operations on Source

    hashtag
    Fixes

    • Fixed NRE in ExportToExcel

    • Fixed NRE in AdvancedSearch for obfuscated code

    • Fixed creating custom actions

    hashtag
    Maintenance

    • Added extra understood Type hints

    • Tweaked exception when FromServiceString fails

    hashtag
    June 2019

    hashtag
    Fixes

    • Fixed vulcanizer issue

    • Fixed PO.AddQuery when Queries.IsReadOnly

    • Fixed issue with PreClient on custom action

    hashtag
    Maintenance

    • Ignore fuzz findings

    hashtag
    May 2019

    hashtag
    New Features

    hashtag
    Query Enhancements

    • Moved persistent object id from QueryResultItem to QueryColumn

    • Better query structure

    hashtag
    Fixes

    • Fixed AdvancedSearch not working on Actions class with other TContext

    • Fixed issue #261

    • Fixed issue #262

    hashtag
    Maintenance

    • Warn for usage of Jurassic 3.0

    hashtag
    April 2019

    hashtag
    New Features

    hashtag
    Azure Storage

    • Added extra AzureStorageConnector retry logic

    • Also retry again for SocketException in AzureStorageConnector

    • Better resilience

    hashtag
    Configuration Options

    • Added Advanced.DisableBrowserDetectLanguage option (#253)

    • Allow tweaking of X-Frame-Options header

    hashtag
    Query Features

    • Allow passing BypassAutoQuery in GetQuery (#257)

    hashtag
    Feedback System

    • BREAKING: Breaking change to allow feedback customization (#260)

    hashtag
    Fixes

    • Fixed issue #247

    • Fixed issue #251

    • Fixed issue #258

    hashtag
    Maintenance

    • Allow int[] as Key (for ObjectIdHasher)

    • Flag System.Buffers as development dependency

    • Ignore TaskCanvas

    hashtag
    March 2019

    hashtag
    New Features

    hashtag
    JWT Support

    • Handle JWT token in GetStream call

    • Better authentication handling

    hashtag
    Request Handling

    • Allow Forwarded-Host with port

    • Better proxy support

    hashtag
    Fixes

    • Fixed issue with db interceptor when an exception is thrown

    • Fixed RequestUri bug

    • Fixed issue #249 - replace usage of request.RequestUri

    hashtag
    Maintenance

    • Code change GetRequestUri

    • Skip interception for initialize logic

    hashtag
    February 2019

    hashtag
    New Features

    hashtag
    ImageUrl Feature

    • Added ImageUrl implementation

    • Import image attribute before creating the preview dialog

    • Allow multiple files

    hashtag
    Authentication

    • Added AuthenticatorService.DetermineMissingUserInRequest hook

    • Use custom hook for ValidateAuthToken from Authorization header

    • DetermineMissingUserInRequest Basic Auth example

    hashtag
    Testing

    • Added Tests query

    • Test: Memory stats

    • Test: Memory stats compiling

    • Test: Added ImpersonateViaHeader custom action

    hashtag
    Fixes

    • Fixed issue #245

    • Fixed issue #244

    • Fixed issue #243

    • Fixed issue #130

    hashtag
    Maintenance

    • Prefer ProfiledHttpClient

    • Partially allow HEAD on GetIndex

    • Return null when request is null for request.GetRequestUri()

    hashtag
    January 2019

    hashtag
    New Features

    hashtag
    Excel Enhancements

    • Excel fix for Date(Time) that is changed during QueryExecuted

    • Better date handling in Excel exports

    hashtag
    Helper Methods

    • Added StringEx.SmartJoin overload

    • More string utilities

    hashtag
    Fixes

    • Fixed diagnostics issue when Bindings are empty

    • Fixed issue with cdncache and using http url as web2 version

    hashtag
    Maintenance

    • Sample code updates

    • Prefer hc-sql server for sample code

    • ImageUrl initial implementation


    Note: Commits marked with (test) have been excluded from this changelog as they are internal testing commits.

    5.44.0+6e65421

    Saturday, November 30th, 2019

    hashtag
    Features

    • Added option to explicitly order distinct values

    • Added detection of .NET 4.8 in diagnostics page

    • Added JwtPayload class

    • Added advanced hook to determine friendly filter

    • Added PersistentObject.KeepValueChanged

    • Added advanced hook for customizing Advanced search

    • Added advanced hook when a user opens its User settings page

    hashtag
    Changes

    • Tweaked exception when FromServiceString fails

    • Show extra information for repeating jobs (last execution, execution count)

    • Don't remove request data when disposing UserSession

    hashtag
    Fixes

    • Don't throw when user agent is not found

    • Fixed issue when creating custom actions from Management

    • Fixed NullReferenceException when cdncache.tmp is empty

    Changelog 2021

    hashtag
    December 2021

    hashtag
    New Features

    hashtag
    SCIM Enhancements

    • Added IScimHandler.OnPostUser hook

    • Better error info for invalid Operations in SCIM patch

    hashtag
    Diagnostics

    • Added Advanced.OnDiagnostics hook

    • Added DiagnosticsArgs.AddAssembly helper

    hashtag
    Fixes

    • Fixed Excel issue with empty rows

    • Fixed issue when users/administrators group name is changed

    • Convert empty string to null for BinaryFile?

    hashtag
    Maintenance

    • Exposed whether PreviewLoadArgs was rerouted

    • Tweaked "could not sort on property" messages

    • Removed duplicate Base64UrlEncoded code

    hashtag
    November 2021

    hashtag
    New Features

    hashtag
    ViewModels

    • Added ViewModels for automatic logic when working with views/view models

    • Added ReaderWriter lock when working with ViewModels naming rules

    hashtag
    BinaryFile

    • Added BinaryFile type for file handling

    • BinaryFile enhancements with better conversion support

    hashtag
    ObjectId

    • Added ObjectId type for unique identifiers

    hashtag
    Value Objects

    • Added ValueObjects.SetPropertyName

    • Added ValueObjects.GetHandler helper

    • Allow value objects to use custom queries

    hashtag
    User Management

    • Added IUser.IsMemberOfAny for group membership checking

    hashtag
    Helper Methods

    • Added GetLookupValue extension method

    • Added Manager.IsWeb2OrGreater

    hashtag
    Fixes

    • Fix for Open-XML-SDK issue #1070

    • Don't flag attribute as sensitive in new

    • Handle [KeyValueList] correctly for Database.ValueObjects query

    hashtag
    Maintenance

    • Flag PersistentObjectAttribute.GetValue as obsolete

    • Don't allow removal of last English language

    • Updated .NET 6.0 packages

    hashtag
    October 2021

    hashtag
    New Features

    hashtag
    .NET 6.0 Support

    • Added .NET 6.0 support

    • Updated packages for .NET 6.0 RC2

    hashtag
    Value Objects

    • Introduced ValueKeyAttribute

    • Nested value objects support

    • ValueObject tweaks (nested key, remove operations)

    hashtag
    Query Enhancements

    • Added GetExpressionForDataFilterSelection

    • Always sort by user language for TranslatedString

    hashtag
    SCIM Improvements

    • SCIM tweaks and fixes

    • Fixed SCIM not returning valid response

    hashtag
    Web Features

    • Added GetWebsiteContent hooks

    • WebsiteContents tweaks

    • Added HttpEx.TryGetCookie

    hashtag
    Fixes

    • Fixed issue when creating groups in empty database

    • Fixed 500 when accessing /api or /api/

    • RavenDB: Issue when casting inside Chart WithValues

    hashtag
    Maintenance

    • Use read/write locks for VidyanoDbCache (#322)

    • Expose customizations on SortArgs

    • RetryAction has optional message

    hashtag
    September 2021

    hashtag
    New Features

    hashtag
    Compression Support

    • Enable gzip compression support

    • Gzip tweaks for better performance

    hashtag
    TranslatedString

    • TranslatedString System.Text.Json support

    • TranslatedString cast from POA

    • Added .FromJson helper

    • TranslatedString NotEmpty rule on synchronize existing attribute

    hashtag
    QR Code

    • Advanced QR scenarios support

    hashtag
    Fixes

    • Fixed issue in compressed CustomApiController.Json helper method

    • Fixed typo when using lookup source

    • Remove EF reference from Vidyano (#318)

    hashtag
    Maintenance

    • VerboseLoggingMiddleware will report 500 for unhandled exceptions

    • Should always set Columns for detail queries

    • Better handling of DI scope for non-HTTP requests (#313)

    hashtag
    August 2021

    hashtag
    New Features

    hashtag
    Excel Support

    • Excel export functionality improvements

    hashtag
    Database Context

    • Added ITargetDbContext interface

    hashtag
    TranslatedString

    • Added TranslatedString.GetTranslation method

    hashtag
    Custom Actions

    • Added AsyncCustomAction.Intent

    hashtag
    Fixes

    • Fixed missing query being passed in ApplyDataSecurity

    • Fixed issue #309

    • Fixed Manager.UpdatableLog inside async call

    hashtag
    Maintenance

    • Improved Vidyano.Root handling

    • No need for manual UseStaticFiles

    • Allow changing of name of Administrators and/or Users built-in groups

    hashtag
    July 2021

    hashtag
    New Features

    hashtag
    Datadog Integration

    • Fixed Datadog issue for Raven logs

    • Track warning/error for verbose logs and correct timestamp

    hashtag
    Fixes

    • Fixed NRE in RavenDBCacheUpdateInformer

    hashtag
    June 2021

    hashtag
    New Features

    hashtag
    Datadog Integration

    • Datadog integration added (#303)

    • Complete monitoring and observability support

    hashtag
    Verbose Logging

    • Added RepositoryVerboseLogStore

    • Better logging infrastructure

    hashtag
    Web Vulcanizer

    • Added IWebVulcanizer interface

    hashtag
    API Extensions

    • Added HttpRequest.GetRequestBodyAsString(Async) extension methods

    hashtag
    Fixes

    • Fixed loggingmiddleware breaking form values

    • TypeScript typings fix (duplicate ResizeObserver)

    hashtag
    Maintenance

    • Allow PersistChanges for IsValueObject if not inside AsDetail attribute

    • Allow sorting/filtering on valueobject detail queries

    • Missing template update for RavenDB PersistentObjectActionsReference

    hashtag
    May 2021

    hashtag
    New Features

    hashtag
    Query Enhancements

    • Expose Query on PreviewActionArgs

    hashtag
    April 2021

    hashtag
    Fixes

    • Fixed issue when SeederHash is changed

    • Fixed issue with NewUser patch

    • Fixed issue #299

    hashtag
    Maintenance

    • PostgreSQL: Fixed typo when removing user from group

    hashtag
    March 2021

    hashtag
    New Features

    hashtag
    TranslatedString (#296)

    • Introduced TranslatedString type for multilingual support

    • Complete internationalization infrastructure

    hashtag
    Two-Factor Authentication

    • Allow easier verifying of two-factor token

    hashtag
    Dependency Injection

    • Use DI for Api method invocation

    • Use ActivatorUtilities for custom actions

    • BREAKING: Consistency in POActions creation with CustomActions

    hashtag
    Fixes

    • Fixed issue #297

    • Fixed NRE when using Reference as breadcrumb on Reference

    • Fixed wrong order in default culture.json

    hashtag
    Maintenance

    • Allow redirect inside GetWebsiteContent

    • Nullability improvements

    hashtag
    February 2021

    hashtag
    New Features

    hashtag
    Configuration

    • Added DisableUserLastLoginDate config option

    hashtag
    CSS Processing

    • Handle @apply for vulcanized CSS

    • Better CSS processing

    hashtag
    Fixes

    • Fixed ArgumentNullException on Setting.GetLockedValue

    • Handle empty model.json with only Verbose set

    hashtag
    January 2021

    hashtag
    New Features

    hashtag
    Expression Generation

    • Better expression generation for exclusions (fixes issue on RavenDB)

    hashtag
    Fixes

    • Fixed issue #291

    • Multiple fixes related to assembly naming

    hashtag
    Maintenance

    • Reverted Assembly name for Vidyano.Service

    • Pipeline improvements

    • Updates for Vidyano.SqlServer/Vidyano.PostgreSQL


    Note: Commits marked with (test) or [skip ci] have been excluded from this changelog as they are internal testing commits.

    5.38.3+a697611

    Thursday, July 26th, 2018

    hashtag
    Features

    • Redirect to Web2 CDN by default instead of proxying requests, will allow browser cache and even between different Vidyano applications

    • Cache vulcanized requests for better performance

    • Made all requests handling async

    • Make use of the System.Buffers package if it is added to a Vidyano application

    • Added advanced hook for handling cache updates manually (Advanced.OnCacheUpdateSaved)

    • Added PersistentObject.DialogSaveAction to use a different action for the default Save button on dialogs

    • Added AsyncCustomAction class to have a complete async flow in custom actions

    hashtag
    Changes

    • Calling Manager.DeleteUser with the name of a group will no longer delete the group

    • Keep working with in-memory cache when CDN is not available and CDN is being proxied

    • Expose more information on SCIM /Groups

    hashtag
    Fixes

    • Fixed issue when deleting empty group

    • Fixed issue with TLS 1.1/1.2 not being used for external requests

    • Fixed issue when invalid model.json was loaded

    5.45.0+26864bd

    Monday, February 10th, 2020

    hashtag
    Features

    • Added Advanced search save-load

    hashtag
    Changes

    • Always include name in ProgramUnitItemGroup based on DefaultLanguage

    • Trim user name that is passed to GetCredentialType

    • Expose friendly information when a FaultException is thrown in GetCredentialType/HandleUnknownAuthenticate

    hashtag
    Fixes

    • Fixed issue with ExportToExcel not respecting custom column order from user

    • Fixed NullReferenceException when starting a legacy Vidyano application

    • Fixed NullReferenceException when searching on a reference attribute that uses breadcrumb attributes that aren't available (i.e. because they are hidden or disabled through security)

    5.39.1+f04e696

    Tuesday, August 28th, 2018

    hashtag
    Features

    • Added ProjectionStringLengthAttribute to reduce the length of string columns in the projected type (i.e. to only get the first 101 characters of the Message column from the Vidyano.Logs)

    • Updated repository version to V60 to introduce optimized cache updates, load-balanced deployment should get a big performance increase

    • Added custom user schema support for SCIM

    hashtag
    Changes

    • Don’t show stack traces to users that aren’t in the Administrators group (a Log-id is shown instead)

    • Exposed AuthenticationService.HandleUnknownAuthenticate to handle custom /Authenticate/X requests (only SAML2 is handled by default)

    • Exposed the IScimHandler interface for SCIM customizations

    hashtag
    Fixes

    • Fixed issue when corrupt model.json is fixed on read-only deployment

    • Fixed threading issue which caused Options for a SelectInPlace attribute to be empty

    • Fixed issue that caused fallback to default sort options not working if attribute no longer exists

    Storage Provider

    Vidyano has the ability to store incoming and outgoing requests when the verbose logging feature is enabled. This can help for troubleshooting requests or for auditing purposes.

    By default it will use the Vidyano.Logging connection string to create a blob container to store the data as block blobs.

    Using the Advanced.StorageProvider property you can set your own provider that implements the IStorageProvider interface.

    hashtag
    Example

    This example will store the data inside the App_Data/Logs folder.

    Vidyano contains a Vidyano.Core.External.FolderStorageProvider implementation that has gzip and encryption support.

    Courier Feature

    hashtag
    1. Overview

    The Courier feature in Vidyano provides a reliable, message-based processing system built on top of RavenDB. It enables asynchronous communication between different parts of your application through a publish-subscribe pattern, supporting immediate and delayed message delivery with at-least-once guarantees.

    hashtag
    2. Enabling the Courier Feature

    To enable the Courier feature in your Vidyano application:

    1. Register the feature in your Startup.cs file:

    hashtag
    3. How It Works

    The Courier feature works as follows:

    1. Message Publishing: Messages are stored in RavenDB as CourierMessage documents.

    2. Message Processing:

      • A RavenDB subscription monitors the database for new messages

    hashtag
    4. Key Features

    hashtag
    4.1 Message Delivery Patterns

    • Immediate Delivery: Messages are sent and processed as soon as possible

    • Delayed Delivery: Messages are processed after a specified time delay

    • At-Least-Once Delivery: Messages are guaranteed to be delivered at least once

    hashtag
    4.2 Idempotent Messages

    Messages can implement the IIdempotentMessage interface to ensure they are only processed once, identified by a unique identifier.

    hashtag
    4.3 Message Retry

    Failed messages can be automatically retried based on configurable retry strategies.

    hashtag
    4.4 Message Expiration

    Processed messages are automatically removed from the system after a configurable expiration period.

    hashtag
    5. Usage Examples

    hashtag
    5.1 Defining a Message

    hashtag
    5.2 Creating a Message Handler

    hashtag
    5.3 Sending Messages

    hashtag
    5.4 Chain of Messages

    hashtag
    6. Configuration Options

    The Courier system can be configured in your appsettings.json file:

    Configuration options:

    • RetryWaitTime: Time to wait before retrying subscription connection (default: 30 seconds)

    • MaxDownTime: Maximum period the system will be down before giving up (default: 5 minutes)

    • MaxDocsPerBatch: Maximum number of messages processed in a batch (default: 25)

    hashtag
    7. Best Practices

    1. Keep Messages Small: Store only essential information in messages.

    2. Make Messages Immutable: Use C# record types or immutable classes.

    3. Design for Idempotency: Ensure that processing a message multiple times does not cause issues.

    hashtag
    8. Troubleshooting

    If messages are not being processed as expected:

    1. Check Subscription Status: Ensure the RavenDB subscription is active.

    2. Verify Handler Registration: Confirm that your message handlers are registered correctly.

    3. Review Message Serialization: Check that your message classes can be properly serialized/deserialized by JSON.NET.

    5.32.1+0c41761

    Saturday, February 10th, 2018

    hashtag
    Features

    • Added Manager.OriginalUser to determine which user impersonated the current user

    5.35.5+2316022

    Friday, March 30th, 2018

    hashtag
    Features

    • Vidyano will now throw a SaveFailedException inside SaveExisting/SaveNew/SaveDetails when it has an error

    Roslyn docs configuration
    Revokes all sessions when sliding sessions are enabled
    Fixed issue ensuring AddTypeHint quotes value correctly if needed
  • Fixed IsWeb2OrGreater handling logic

  • Improved console logging for SchemaSynchronizer

  • Updated documentation with correct URLs
  • Created snupkg files for debugging

  • Vidyano.Abstractions version 6.4.0

  • Added readme to NuGet package
  • Enabled deterministic build

  • Don't remove request data when disposing UserSession
    Fixed NRE when calling GetError with uninitialized cache
    Fixed issue #241
  • Fixed issue #242

  • Don't expose database exception in GetClientData

  • Truncate logger entries
  • Test: Configure JWT key

  • Added query grid cell template
  • Allow reordering

  • Fixed issue when image is bigger than 512KB

  • Swallow exceptions from DetermineMissingUserInRequest
  • Test: ImageUrl changes read-only

  • Fixed issue #238

  • Allow text filter op string[] for non-EF query (#248)

  • Fixed issue with Web2Version setting update not being propagated

  • Tweaked EF profiler (using IDbCommandInterceptor)
  • Pass caught exceptions to profiler

  • Pass targetContext correctly when filtering for load entity
  • Fixed issue with Hasherid not working for EF POCO entity

  • Fixed issue when ContentProperty points to DbQuery<T>

  • Fixed issue with empty ProgramUnit staying

  • Updated packages
  • Nullability improvements

  • Better value object handling with nested support
    Removed Advanced.PreCommandExecute hook
  • Nullability improvements throughout

  • Helper for reloading POA.Options for ILookupKeyValueData

  • Exposed CustomQueryArgs constructor

  • Exposed ValueObjects.IsValueObject and added TryGetRootEntity

  • RavenDB: Performance issue with .Include not working with .AsNoTracking
    Cloudflare changes
  • Show installed plugins info

  • Updated packages

  • Nullability tweaks

  • Don't check SecurityScope for Profiler
  • Allow TranslatedString to be used outside a Vidyano application

  • Cache HttpRequestEx.GetRequestUri/GetClientIpAddress

  • Made explicit that ConfigurationManager.AppSettings[] never returns null

  • Nullability improvements

  • Fixed issue #311
    Set IsValueObject correctly on detail queries/asdetail/withreference
  • Handle ValueObject AsDetail handling on RavenDB, single DB call for Save

  • Don't verbose log without VidyanoMethod

  • Non-generic ToProjection

  • Updated packages

  • Exposed hooks for TextSearchHandler (StartsWith/Contains/EndsWith)
  • Code cleanup

  • PostgreSQL: Fixed issue with wrong function name
    Parent PersistentObject’ ObjectId/IsNew is now set before the lookup quueries are executed on reference attributes
  • Removed unused version override support on web2 endpoint

  • Added more logging information when an exception is thrown during ExecuteQuery

  • Implemented SCIM PUT /Users/ID

  • Allow SCIM PUT/PATCH /Users/ID to change user.Name

  • Added Vidyano.AuthTokenExpirationDevMultiplier appSetting for longer expiration during development

  • Keep ObjectId from newly saved entity in verbose logs

  • Added Reload/SessionLost client messages

  • Copy all attributes values to entity when saving new entity

  • Added detection for .NET 4.7.2 in diagnostics page (and fixed detection of 4.7.1)

  • Missed the notificationDuration parameter in some methods

  • Append random data to verbose log rowKey to reduce duplicates

  • Allow patch import to be used on already patched data

  • Fixed issue with ExportToExcel on Advanced search not returning any rows

  • Fixed issue with verbose logging not working if repository cache failed to load

  • Changed required rights for a custom AddReference query from Edit to Query

  • Changed logic for creating new context in PersistentObjectActions/AsyncCustomAction

  • Also show non-database SqlErrors to end-users (e.g. timeout)

  • Fixed issue that the current groups weren’t returned correctly for the current user

    Give Feedback/Profiler rights if OriginalUser is member of Administrators
  • Log Feedback as OriginalUser

  • hashtag
    Changes

    • Don’t show DisableTwoFactor for users that require Two-factor

    • Changed new Vidyano project template with more entropy for application salt and updated the default generated files

    hashtag
    Fixes

    • Fixed issue when writing custom filter for Azure table query

    Added computed attributes that can be translated to database calls
  • Added grouping on attributes

  • Added IncludeCount on ProgramUnitItem to send query count to client during GetApplication

  • hashtag
    Changes

    • Still send profiler information (if allowed) when an exception occures

    • Don’t send SqlException information to client for non-admins, instead a generic database error message is shown with a log id

    • Use ObjectEx.GetSecureRandomString for SecurityToken salt

    • Allow HEAD method on /Poll endpoint

    • Added localNameSelector parameter for PieChart.WithValues

    • Expose Manager.WebsiteRoot property

    hashtag
    Fixes

    • Fixed issue with verbose logging to sql server not trimming data correctly

    • Fixed issue when incoming user name not trimming correctly

    • Fixed issue when using ResetPasswordNextLogin for a user without a password (e.g. for a new user)

    • Fixed issue with instant search input not trimming correctly

    • Fixed security issue that might leak profiler information on invalid requests

    • Fixed issue with verbose logging only showing 101 records when db is used

    • Fixed issue when VPD Where handler assumed IEnumerable

    • Fixed issue with Edge displaying MultiLineString/CommonMark as “null” on New entity

    • Fixed issue with ComputeTotalItems not working for PageSize=0

    5.27.0+6b9495e

    Friday, October 27th, 2017

    hashtag
    Features

    • Added Advanced.TryReadDataFile/WriteDataFile hook to customize loading json files from App_Data

    • Added QueryAction enum to define built-in actions on query that can be passed to Query.DisableActions

    • Added IExcelWriter.SetCell method that can also handle data type (numbers, dates, boolean, …)

    • Added IUser.IsEnabled/Enable()/Disable()

    hashtag
    Changes

    • Changed serialization property order to make debugging of http requests easier

    • Added overload on CustomApiController.Json to also pass JsonSerializerSettings

    • Added Tag property on service objects to pass any extra data to the client

    hashtag
    Fixes

    • Fixed issue with unique constraint violation not using attribute’s label

    • Fixed issue with PersistentObject.SaveDetails causing PersistentObject.PopulateAttributeValues to fail

    • Fixed issue with Query UserRight not having Filter action

    using System.IO;
    using System.Web.Hosting;
    using Vidyano.Core.External;
    
    public sealed class FolderStorageProvider : IStorageProvider
    {
        private readonly string path = HostingEnvironment.MapPath("~/App_Data/Logs");
        public void Delete(AzureStorageAccount account, string containerName, string name)
        {
            File.Delete(Path.Combine(path, containerName, name));
        }
    
        public void EnsureExists(AzureStorageAccount account, string containerName)
        {
            Directory.CreateDirectory(Path.Combine(path, containerName));
        }
    
        public string DownloadText(AzureStorageAccount account, string containerName, string name)
        {
            return File.ReadAllText(Path.Combine(path, containerName, name));
        }
    
        public string UploadText(AzureStorageAccount account, string containerName, string name, string data)
        {
            File.WriteAllText(Path.Combine(path, containerName, name), data);
            return string.Empty;
        }
    }

    When a message is detected, the system finds the appropriate recipient(s)

  • Each recipient processes the message through its ReceiveAsync method

  • After processing, messages are marked as processed with an expiration time

  • Message Lifecycle:

    • Created → Waiting for Processing → Processed → Expired

    • Or: Created → Delayed → Waiting for Processing → Processed → Expired

    • Or: Created → Waiting for Processing → Failed → Retry → Processed → Expired

  • Handle Exceptions: Implement proper exception handling in your message handlers.
  • Use Message Chains: Break complex workflows into chains of simple messages.

  • Consider Message Expiration: Set appropriate expiration times for processed messages.

  • Monitor the System: Implement logging and monitoring for message processing.

  • Examine Expired Messages: Look for messages that have expired before processing.
  • Look for Exceptions: Check exception logs for errors in message handlers.

  • Inspect RetryWaitTime: Adjust RetryWaitTime if messages are not being retried quickly enough.

  • Disable Specific Message Types: Use the Courier{MessageTypeName}Disabled setting to temporarily disable processing of specific message types.

  • public void ConfigureServices(IServiceCollection services)
    {
        // Add other services...
        
        // Register your Courier message handlers
        services.AddRecipient<YourMessage, YourMessageHandler>();
    }
    // Regular message
    public record NotificationMessage(string Subject, string Body, string RecipientEmail);
    
    // Idempotent message
    public record OrderProcessedMessage(string OrderId, DateTimeOffset ProcessedOn) : IIdempotentMessage
    {
        // Implementation of IIdempotentMessage.Identifier
        public string Identifier => $"order-processed-{OrderId}";
    }
    public class NotificationMessageHandler : IRecipient<NotificationMessage>
    {
        private readonly IEmailService _emailService;
        
        public NotificationMessageHandler(IEmailService emailService)
        {
            _emailService = emailService;
        }
        
        public async Task ReceiveAsync(ReceiveArgs<NotificationMessage> args, CancellationToken cancellationToken)
        {
            var message = args.Message;
            
            // Process the message
            await _emailService.SendEmailAsync(
                message.RecipientEmail, 
                message.Subject, 
                message.Body, 
                cancellationToken);
            
            // Configure message expiration (optional, defaults to 1 day)
            args.ExpireAfter = TimeSpan.FromDays(7);
            
            // Example of sending a follow-up message
            args.Courier.Send(new NotificationLoggedMessage(message.RecipientEmail));
        }
    }
    // Get the courier service
    using var _ = ServiceLocator.GetScopedRequiredService<ICourier>(out var courier);
    
    // Send immediate message
    courier.Send(new NotificationMessage(
        "Welcome!", 
        "Thank you for registering.", 
        "user@example.com"));
    
    // Send delayed message (relative time)
    courier.DelaySend(
        new ReminderMessage("Don't forget to complete your profile."), 
        TimeSpan.FromDays(3));
    
    // Send delayed message (absolute time)
    var nextMonday = GetNextMonday();
    courier.DelaySend(
        new WeeklyReportMessage(), 
        nextMonday);
    
    // Send idempotent message
    // This will only be processed once, even if sent multiple times with the same ID
    courier.Send(new OrderProcessedMessage("ORD-12345", DateTimeOffset.UtcNow));
    public class OrderCreatedMessageHandler : IRecipient<OrderCreatedMessage>
    {
        public Task ReceiveAsync(ReceiveArgs<OrderCreatedMessage> args, CancellationToken cancellationToken)
        {
            // Process the order
            ProcessOrder(args.Message);
            
            // Start order fulfillment process by sending another message
            args.Courier.Send(new InitiateFulfillmentMessage(
                args.Message.OrderId, 
                args.Message.Items));
                
            // Schedule a follow-up message after 3 days
            args.Courier.DelaySend(
                new OrderFollowUpMessage(args.Message.OrderId, args.Message.CustomerEmail),
                TimeSpan.FromDays(3));
                
            return Task.CompletedTask;
        }
    }
    {
      "Vidyano": {
        "Courier": {
          "RetryWaitTime": "00:00:30",
          "MaxDownTime": "00:05:00",
          "MaxDocsPerBatch": 25
        }
      }
    }

    5.21.1+923828

    Tuesday, July 18th, 2017

    hashtag
    Features

    • Added ability to disable computing of total items for queries, e.g. skipping the extra count call to the database

    5.26.2+bccf416

    Wednesday, October 11th, 2017

    hashtag
    Features

    • Added ability to define default/cancel button index for RetryAction

    5.19.0+0964f9

    Wednesday, May 24th, 2017

    hashtag
    Features

    • Added ability to request PO on backend using IsNew directly

    5.22.1+557c11

    Friday, July 28th, 2017

    hashtag
    Features

    • Added ability to skip data security when using GetEntity/FindByObjectId

    5.23.0+9b8b99

    Thursday, August 7th, 2017

    hashtag
    Features

    • Added ability to define SwaggerAttributes using Advanced.HandleSwaggerMetadata

    5.20.0+95f4d1

    Wednesday, June 7th, 2017

    hashtag
    Features

    • Added ability to define Register PO and handle Forgot password logic ()

    Added ability to disable implicit rights for Administrators group allowing for easier testing of rights (e.g. <add key="Vidyano.NoImplicitAdminRights" value="True" />)
  • Added ability to define cidr ranges for less strict ip check by setting the Vidyano.CidrRanges app setting (e.g. <add key="Vidyano.CidrRanges" value="192.168.0.0/16;127.0.0.0/24" />)

  • Added Duplicate dev action on User right and Report

  • Always log exceptions on Api methods

  • Added ability to create new users with settings directly and flag to throw exception if user already exists

  • Updated available type hints on attributes for Web2 client

  • Added .NET 4.7 detection on diagnostics page

  • Added some reserved words for program unit names to prevent conflicts with routes

  • Added new CheckDetailRules method on PersistentObjectActions that will called before trying to save a detail PO

  • hashtag
    Changes

    • Throw exception during OnLoad if entity is not found instead of setting notification

    • Don’t store new group in patches, added notifications to describe recommended behavior

    • Updated DocumentFormat.OpenXml NuGet dependency to 2.7.2

    • Updated Newtonsoft.Json NuGet dependency to 10.0.3

    • Made CommonMark dependency optional, if you are not using this you can remove the NuGet dependency

    hashtag
    Fixes

    • Fixed issue when deleting PO that had detail queries on another PO

    • Fixed issue when using <= on date time

    • Fixed issue when using space to separate hour part

    • Fixed issue with invalid sort options for reports

    • Fixed issue when saving query filters with NoDatabase enabled

    • Fixed issue when a native client connects to a production environment

    • Fixed issue with custom query that has another entity type not using DefaultPersistentObjectActions class

    • Fixed issue when adding a new language and no microsoft translator key was defined

    • Fixed issue when renaming Persistent Object on an application with verbode model enabled

    hashtag
    Changes
    • Strip comments from vulcanized html for Web2

    • Made ImageUtils class public (can validate image, generate QR code, …)

    • Don’t show New Query UserRight on Custom Actions’ Rights query

    • Show more information from DbUpdateException and UpdateException in GenerateMessage

    • Changed logic for converting decimal to service string to match client

    • Updated signature of RefreshOperation.Query to reflect that it can be either a name or an id

    • Refresh queries with user rights when saving or deleting user right

    • Changed WebController.GenerateLocalAuthToken to use same long expiration as staysignedin

    hashtag
    Fixes

    • Fixed issue when ACS was used through proxy

    • Fixed issue with user created through CreateNewUser not loading groups

    • Fixed issue with AutoCreateUsersInGroup having invalid options after a refresh

    • Fixed a caching issue when a group is renamed that an user can’t be added to that group

    • Fixed NullReferenceException when using HttpHandler directly with WebController with null HttpContent in request

    • Fixed issue with Manager.DeleteUser

    • Fixed issue with ExecuteAction through form using 100% cpu for very large requests in chrome

    Added Advanced.HandleUnobservedTaskException hook
  • Use TypeConverter when converting to and from a service string

  • Allow changing of IUser.Profile

  • hashtag
    Changes

    • Don’t block application start when cleanup of CacheUpdates/Logs fails

    • Respect developer CanSort=false options for existing user sort options

    • Allow Async suffix for custom api methods

    • Don’t show outdated model message when model hash is IGNORED

    hashtag
    Fixes

    • Fixed issue with Word.Generate when passing IsNew PO trying to add queries

    • Fixed issue with AzureTableQuery in Release builds

    • Fixed issue with IUser.Profile not returning correct data

    • Fixed issue with unknown user id on report throwing NullReferenceException

    • Fixed issue when AutoQuery is enabled during OnConstruct(query, parent)

    Added Advanced.BlacklistedPasswords per Microsoft Password Guidance for improved security

    hashtag
    Changes

    • Show more information when repository metadata upgrade failed

    • Updated XML comments to indicate that GetEntity/FindByObjectId will use data security

    • Don’t use data security when loading entity for read-only reference attribute

    • Increased default BCrypt complexity to 13 (will rehash passwords on first use)

    • Changed default Password Complexity setting for new projects to None as per Microsoft Password Guidance

    hashtag
    Fixes

    • Fixed issue with distincts on lookup query showing wrong values

    • Fixed issue with new CheckDetailRules failing for New entity

    • Fixed issue with Random not being thread safe

    • Fixed issue with circular group memberships

    Added support for using continuation tokens on custom queries

    hashtag
    Changes

    • Updated XML comments to explain which claims are used for UnknownUser

    • Removed obsolete code to use pages for querying instead of skip/top

    hashtag
    Fixes

    • Made sure that filters are included correctly for queries that are added during OnLoad

    • Fixed issue with Security page in NoDatabase mode trying to use database

    • Fixed issue with not being able to create new feedback

    hashtag
    Changes
    • Changed ToServiceString for enums to use default ToString (allows undefined enum values to be converted to numeric value)

    hashtag
    Fixes

    • Fixed issue with Verbose logs filtering

    Register / Forgot passwordarrow-up-right

    5.13.1+c8fdb1

    Wednesday, March 22nd, 2017

    hashtag
    Features

    • Added per website setting for Web2 version

    hashtag
    Fixes

    • Fixed issue with NoDatabase mode not synchronizing repository changes

    5.11.1+d7647c

    Tuesday, March 14th, 2017

    hashtag
    Features

    • Added ApiMethodAttribute.NeedsAuthentication to require Authorization header

    • Added ability to manage filters for users using code

    • Added Advanced.Poll method to add extra logic to /poll request

    • Added ability to override Vidyano Settings using AppSettings ()

    hashtag
    Changes

    • Don’t serve index html for static resources that are not found

    • Use all application languages for date operations (today, …)

    • Improved performance when saving model changes in Verbose mode

    hashtag
    Fixes

    • Fixed issue with empty language value not being set when it has the same translated value as English

    • Fixed issue with some translations being incorrectly reused

    examplearrow-up-right

    5.7.1+554316

    Wednesday, February 1st, 2017

    hashtag
    Features

    • Added ExportToCsv action

    • Added Manager.GetUsersForGroup method

    • Use DocumentFormat.OpenXml NuGet 2.7.1

    hashtag
    Changes

    • Updated CommonMark.NET NuGet dependency to 0.15.0

    • Updated WindowsAzure.Storage NuGet dependency to 8.0.1

    • Show better exception when sorting fails on custom IEnumerable query

    hashtag
    Fixes

    • Fixed issue when migrating repository to new semantic version

    • Fixed issue when using bulk-edit on PersistentObjectAttributes

    • Fixed issue when using bulk-edit on UserRights

    Removed DB call when filtering on reference attribute

    Computed attributes

    This information is still applicable to v6, for the code snippet, the CustomerActions class should be partial and the base type is not needed.

    Computed attributes can be used as an alternative to views but still keep the same performance. By defining the expression for a computed attribute Vidyano can make sure that the expression is translated by Entity Framework to the correct sql code.

    hashtag
    Usage

    Computed attributes should be defined in the static Initialize method of the specific Persistent Objects’ Actions class and added manually as an attribute with the correct mapping. All computed attributes will automatically be flagged as read-only.

    Once configured they can be used to sort, filter (with distincts) or group on. They can be shown in a query and when loading existing entities.

    hashtag
    Remarks

    Only valid EntityFramework expression can be used if the code needs to be translated to sql (e.g. no custom extension methods)

    public class CustomerActions : PersistentObjectActionsReference<AdventureWorksEntityContainer, Customer>
    {
        public static void Initialize()
        {
            SetComputedAttribute("OrdersCount", entity => entity.SalesOrderHeaders.Count);
            SetComputedAttribute("OrdersTotal", entity => entity.SalesOrderHeaders.Select(h => h.TotalDue).DefaultIfEmpty().Sum());
            SetComputedAttribute("FullName", entity => entity.FirstName + " " + entity.LastName);
        }

    Tutorial 1: Your first application (Legacy)

    circle-exclamation

    This is kept for informational purposes as this no longer applies to v6 projects.

    hashtag
    Prerequisites

    hashtag
    Downloads

    hashtag
    Installation

    Extract and run the Sample database installer to deploy the database to your local SQL Server. This tutorial assumes that you keep the default name for the database "MyCRM".

    hashtag
    Tutorial

    hashtag
    Step 1: Creating a new Vidyano Project

    Launch Visual Studio 2017 or higher. From the File menu, select New ▶ Project.

    From the templates on the left, select Visual C# ▶ Vidyano.

    Choose Vidyano Application,give your project a Name and click OK.

    hashtag
    Step 2: Name and protect your new application

    Give your App a Title and provide an administrative Password to secure the backend. Make sure to pick a secure password.

    Click Next to continue.

    hashtag
    Step 3: Select the target database

    On this wizard step you need to select the database that holds your application data.

    Click on the Browse (...) button next to the Connection String input field.

    Select the MyCRM database that you installed in the prerequisites step of this tutorial.

    Click OK.

    Click Next to continue.

    hashtag
    Step 4: Select the repository database

    Vidyano will store some metadata in repository tables. Select the database where these tables will be created.

    By default the connection string above will be the same as your target database, in this case MyCRM.

    circle-info

    Optionally you may also select a separate database to store the repository data as to not make any changes to the target database that may be used by other applications.

    Click Go ! to continue.

    hashtag
    Step 5: Let Vidyano set up your application

    At this point, Vidyano is setting up your project.

    circle-info

    During set up you might get a message dialog asking if you want to search for TypeScript typings, you can select No.

    hashtag
    Step 6: Launch your newly created application and sign in

    Press ctrl+f5 or click the ► button on the toolbar to start your application.

    Use admin as your user name and the password you entered in step 2.

    hashtag
    Step 7: Add a menu item

    Now that you are in, let's add a menu item to see the customers on the database.

    On the menu, click Add menu item.

    Select Customers and click OK.

    Wait for the application to reload and click Customers.

    Congratulations, you just created your first Vidyano application!

    Vidyano Sample databasearrow-up-right

    Actions

    5.17.0+aaa255

    Thursday, April 27th, 2017

    hashtag
    Features

    • Added ability to search for last X days on date(time) attributes (using Last 2 days would return all records for today and yesterday)

    • Added action on reports to regenerate the token to a new random secure token

    • Added ability to return distinct values in descending order (by setting the args.Ascending to false in the GetDistinctValues method)

    • Added action to restart the Web App on the Client -> Websites query in the Management part

    hashtag
    Changes

    • Added extra features to AzureStorageConnector (working with Content-Type, Content-Encoding and generating Shared Access Signature)

    • For pure Web2 applications it is now possible to remove the Templates array inside the model.json

    • Removed developer only actions from Management part from model.json (eg Synchronize, RefreshFromTranslations, StartStop, …) to reduce merge conflicts

    hashtag
    Fixes

    • Fixed issue when deploying a new website to Azure that the bindings would be lost

    For security reasons we no longer send or require an auth token for the default user of an application

  • Show the property name when we couldn’t sort on an unmapped property

  • 5.1.60401.4035

    Friday, November 25th, 2016

    hashtag
    Features

    • Allow new ProgramUnit in Advanced.OnBuildProgramUnits

    • Show validation errors from hidden attributes in PO Notification

    • Added Vidyano.TransactionIsolationLevel app setting to determine IsolationLevel

    • Added POActions.OnBulkSave

    • Added IUser.ChangeName

    hashtag
    Changes

    • Updated CommonMark.NET NuGet dependency to 0.14.0

    • Updated Microsoft.Data.* NuGet dependencies to 5.8.1

    • Updated WindowsAzure.Storage NuGet dependency to 7.2.1

    Installation (Legacy)

    Installation and software requirements

    For Vidyano v6 check Getting started, you no longer need the extension as everything is managed with NuGet packages

    In order to get started you will need to have the following software installed:

    • Visual Studio 2017 Community or higherarrow-up-right

    You will also need to have the Vidyano Extension installed from the Visual Studio Gallery:

    • for Visual Studio

    Removed default logic from POActions.OnRefresh
    SQL Server 2017 Express Edition or higherarrow-up-right
    Vidyano Extensionarrow-up-right

    5.9.0+68a51e

    Friday, February 24th, 2017

    hashtag
    Features

    • Added option to keep selection on query after refresh for custom action (requires Web2 1.10 or higher)

    • Added ApiMethodAttribute to control if manager is required or not

    hashtag
    Fixes

    • Fixed issue with invalid csv being generated

    5.14.1+ec0dbd

    Monday, April 3rd, 2017

    hashtag
    Features

    • Added reference source file for commonly used methods inside the PersistentObjectActions class. Installing the latest NuGet package will add an PersistentObjectActionsReference.cs file

    • Added extra methods on PersistentObjectActions base class to handle common scenarios without having to overwrite the complete methods (SaveNew/SaveExisting/OnDelete/…) ()

    hashtag
    Changes

    • Changed diagnostics page to also show web2 version information for websites

    • Ensure that repository always has all the system settings

    hashtag
    Fixes

    • Fixed issue with correct exception not being shown when RepositorySynchronizer failed on project with NoDatabase enabled

    examplearrow-up-right

    5.16.0+aae2a8

    Friday, April 21st, 2017

    hashtag
    Changes

    • Improved performance when searching verbose logs on Created on

    • Handle searching on User/NullableUser attributes

    • Marked ConvertFromCommonMark as obsolete

    • Allow sorting of attribute with unsortable data type when using sort expression

    hashtag
    Fixes

    • Fixed DbSort clause issue when sorting on reference attribute that isn’t visible

    Azure AD SAML based Sign-on

    Note: This documentation has been updated for v6. Please refer to the v6 Security - Azure AD SAML based Sign-on documentation for the latest information.

    Vidyano can be configured to use Azure AD as an authentication provider. In combination with the SCIM feature to provision the users and groups you could use the Azure AD to completely control your users outside the application.

    hashtag
    Configuration

    You’ll need to set the Single Sign-on Mode to SAML-based Sign-on.

    For the URLs you should use the url of the application for Identifier and followed by Authenticate/SAML2 as Reply URL:

    The Configure button at the bottom will give your the correct settings (SSO Service Url and Base64 Certificate) that you need to use on the Security page.\

    5.12.0+66cbb5

    Friday, March 17th, 2017

    hashtag
    Features

    • Added Instant Search feature (examplearrow-up-right)

    hashtag
    Changes

    • Tweaked new website template to use https:// for google fonts url

    • Tweaked new webcomponent template to remove obsolete content tag

    Allow user registration

    Note: This documentation has been updated for v6. Please refer to the v6 Security - Allow user registration documentation for the latest information.

    On the Security page you can configure the PO that should be shown and the application group for the user rights. For most applications the Register PO will be a new virtual Persistent Object with at least an email address (username) and password attribute. The following code shows an example POActions class for the Register PO.

    public class RegisterActions : PersistentObjectActionsReference<AdventureWorksEntityContainer, object>
    {
        public override void OnSave(PersistentObject obj)
        {
            if (!CheckRules(obj))
                return;
    
            var userName = (string)obj["Email"];
            if (Manager.Current.GetUser(userName) != null)
                throw new FaultException("That user already exists. Use the forgot password functionality to reset your password.");
    
            Manager.Current.CreateNewUser(userName, (string)obj["Password"], profile: new Dictionary<string, string> { { "Registered", "self" } });
    
            obj.AddNotification("You can now login using your email and password.", NotificationType.OK);
        }
    }

    SCIM 2.0 Service Provider

    Note: This documentation has been updated for v6. Please refer to the v6 Security - SCIM 2.0 Service Provider documentation for the latest information.

    The SCIM standard was created to simplify user management in the cloud by defining a schema for representing users and groups and a REST API for all the necessary CRUD operations. See specarrow-up-right

    hashtag
    Example

    To enable the SCIM end-point Vidyano will require an authenticated request, the passed bearer token will need to be checked in the AuthenticatorService class. The easiest way would be to provide a single custom setting that contains the token so that it can be checked.

    Other scenarios could be created by storing multiple tokens in the database.

    hashtag
    Azure AD

    Azure can be configured to sync the AD users with your Vidyano application:

    Tenant URL is the url of the application (e.g. for the demo application the tenant url is https://demo.vidyano.com/ )

    For the mapping we recommended the following settings: Groups

    Users

    Using System for Cross-Domain Identity Management to automatically provision users and groups from Azure Active Directory to applicationsarrow-up-right
    public override bool CheckScimCredentials(ScimCredentials credentials)
    {
        var setting = Manager.Current.GetSetting("ScimBearerToken");
        return !string.IsNullOrEmpty(setting) && setting == credentials.Token;
    }

    5.33.1+12ad63a

    Thursday, February 22nd, 2018

    hashtag
    Features

    • Added support for Pwned Password list (https://haveibeenpwned.com/Passwords) to automatically block breached passwords

    • Added IsSensitive flag on attributes and IsBreadcrumbSensitive on Persistent object

    • Added support for tsv format and $where filtering on reports

    • Added IExceptionService.LogWarning to log catched exceptions as Warning

    • Added IUser.HasPassword/RemovePassword/ResetPasswordNextLogin

    hashtag
    Changes

    • Made SwaggerPathAttribute Path and Operation property public

    • Prefer alwaysStrict tsconfig

    • Skip new PO in synchronize if type already exists in another schema

    hashtag
    Fixes

    • Fixed issue with rights for query not being removed when query was deleted

    • Fixed issue with enum options not showing for nullable enum

    • Fixed issue with IsNew PO not resetting attributes when an AsDetail attribute failed

    Also log api method name in verbose logs
  • Made PersistentObjectAttribute.ToolTip setter public

  • Manager.GetUser returns null for null or empty name

  • Allow setting of response headers when serving index.html

  • Fixed issue with PersistentObjectAttributeWithReferenceBuilder not saving

  • Fixed issue with Security page when Register PO is deleted

  • Fixed ArgumentNullException when saving new User without setting username

  • 5.29.3+30608c3

    Thursday, December 14th, 2017

    hashtag
    Features

    • Updated reports to define minimum required access level, new signature based option using HMAC256 and logging/disabling of compromised report for maximum security (Reports helparrow-up-right)

    • Added InstantSearchArgs.AddRepository method for easy instant search on repository

    hashtag
    Changes

    • Don’t log outgoing content for GetReport/Api in verbose logs

    hashtag
    Fixes

    • Fixed multi-threading issue when using IUser.UpdateLastLoginDate

    5.10.2+a3acd1

    Thursday, March 2nd, 2017

    hashtag
    Features

    • Introduced local cache for Web2 CDN requests and informing of client that the version has changed (can be disabled using the Vidyano.DisableClientVersionCheck app setting)

    hashtag
    Changes

    • Updated CommonMark.NET NuGet dependency to 0.15.1

    hashtag
    Fixes

    • Fixed issue with select all not working when adding queries to program unit

    5.15.2+5ed89a

    Thursday, April 13th, 2017

    hashtag
    Features

    • Added Vidyano.Core.External.AzureStorageConnector helper class for common Azure Storage scenarios.

    hashtag
    Changes

    • Removed Windows Azure NuGet packages in favor of custom implemented REST calls for Verbose Logs. Existing projects will keep the NuGet packages installed but can be removed if they aren’t used.

    • Removed fixed dependency on Jurassic library, Vidyano application can now remove this dependency unless they want to use the server side javascript functionality.

    • Don’t show custom exception message for foreign key SQL error 547

    hashtag
    Fixes

    • Fixed initialization error for new projects

    5.8.0+aab7d8

    Wednesday, February 8th, 2017

    hashtag
    Features

    • Added hook Advanced.PostNewFeedback which is called after a new feedback has been logged

    hashtag
    Changes

    • Removed QueryResultItem.Breadcrumb

    hashtag
    Fixes

    • Fixed issue when saving Settings on SingleInstance

    • Fixed issue when using Manager.GetPersistentObject not passing correct ObjectId when changed

    Legacy v5.x

    Old documentation for Vidyano v5 which was based on .NET full framework (4.8).

    Some content will still be relevant but all parts related to ASP.NET (i.e. HttpResponseMessage or HttpContext) will need to be rewritten with ASP.NET Core alternatives (i.e. IResult, IActionResult, HttpRequest, ...). All parts related to EntityFramework6 syntax will need to be rewritten using EFCore syntax (mostly namespace changed).

    Changelog 2018

    hashtag
    December 2018

    hashtag
    New Features

    hashtag
    Query Projections

    • Added QueryExtensions.ToProjection

    • Better query projection support

    hashtag
    Configuration

    • Use DbConfiguration for VidyanoDbContext

    • Always use named connection string

    hashtag
    Fixes

    • Fixed issue #237

    • Fixed issue #218

    • Ignore various WebSocket exceptions

    hashtag
    Maintenance

    • Made ApiArgs.Version writeable

    • Don't use ApiController.Request property

    • AI improvements

    • GroupingInfoArgs comment change

    hashtag
    November 2018

    hashtag
    New Features

    hashtag
    Performance Optimizations

    • Optimized POA constructor

    • Optimized BulkConstructPersistentObjectAsync

    • Optimized IncludeFilters logic

    hashtag
    User Communication

    • Added SendData to User for sending data over websockets

    • Tweaked IUser.SendData to provide more information

    hashtag
    Loading Strategy

    • Better LoadingStrategy.IncludeReferences handling

    • Expose LoadEntityByObjectIdArgs.Included as ISet

    hashtag
    Settings

    • Added Advanced.IsSettingValueValid

    • Use Setting.DataType

    hashtag
    Fixes

    • Fixed issue #226

    • Fixed issue #233

    • Fixed issue #234

    • Fixed issue with impersonated user not having enough viAudit rights

    hashtag
    Maintenance

    • Added ITargetContext interface

    • Profile precision changed to 0.01ms

    • Made PO.GetDisplayAttributeValue synchronous

    hashtag
    October 2018

    hashtag
    New Features

    hashtag
    Loading Strategy

    • Added PO.LoadingStrategy

    • Cache LoadingStrategy logic

    hashtag
    Query Features

    • Added POA.OptionalColumn

    • Added IQueryable.FilterByObjectId

    hashtag
    Advanced Features

    • Added Advanced.LoadEntityByObjectId

    • Added Manager.HasRepositoryConnection

    hashtag
    Fixes

    • Fixed issue #220

    • Fixed issue with circular PO reference

    • Only send values for columns that are defined after QueryExecuted logic

    hashtag
    Maintenance

    • Ignore ReplaceSensitiveUrlPart if Uri is empty

    • Optimized Include path for DbQuery/ObjectQuery

    • Saml2.0 tweaks

    hashtag
    September 2018

    hashtag
    New Features

    hashtag
    Audit System (vi-audit)

    • Added vi-audit functionality

    • Added dummy Placeholder system PO

    • Tweaked vi-audit to use Placeholder PO

    hashtag
    Job Scheduling

    • Made JobSchedules a system setting

    • Fixed RepositorySynchronizer to fix non-system setting

    hashtag
    SAML 2.0

    • Added hooks for Saml2.0 processing

    • Detect ScimHandler implementation

    hashtag
    Fixes

    • Fixed issue with new RepeatingJob not triggering

    • Fixed issue with impersonated user not having enough viAudit rights

    • Always clean up UpdatingMetadata flag

    hashtag
    Maintenance

    • Set Import PO as OpenInEdit

    • Profile CreateUserSession creation

    • Replace LogVerboseData's authToken with expiration info

    hashtag
    August 2018

    hashtag
    New Features

    hashtag
    Cache Updates

    • RepositoryVersion V60 - CacheUpdates changes

    • Fixed CacheUpdate issues

    hashtag
    SCIM Extensions

    • Added custom user schema support

    • Fixed filter issues

    hashtag
    Authentication

    • Added AuthenticatorService.HandleUnknownAuthenticate

    hashtag
    Fixes

    • Fixed issue when saving readonly cache when model load autofixes

    • SelectInPlace threading issue

    • Fixed cacheupdate after sync

    hashtag
    Maintenance

    • Reuse original context for DbQueries

    • ReSharper speller dictionary

    • Added test code for working with interfaces as TContext

    hashtag
    July 2018

    hashtag
    New Features

    hashtag
    Async Custom Actions

    • Added AsyncCustomAction

    • Added PO.DialogSaveAction

    hashtag
    Hashids

    • Fixed entropy issue when using Hashids

    • Hashids changes

    hashtag
    Performance

    • Performance optimizations

    • Use CompiledGenericAccessor for distincts

    hashtag
    ProjectionStringLength

    • Added ProjectionStringLengthAttribute (#208)

    • ProjectionStringLength use cases

    hashtag
    Fixes

    • Fixed issue #195

    • Fixed issue #196

    • Fixed issue #194

    • Fixed issue #198

    hashtag
    Maintenance

    • Added Vidyano.AuthTokenExpirationDevMultiplier appSetting

    • Added Reload/SessionLost message use DefaultTranslations for new message

    • Cache vulcanized request for 5min on Global.IsReadOnly

    hashtag
    June 2018

    hashtag
    New Features

    hashtag
    User Notifications

    • UserNotification changes and improvements

    • Support AccountSAS for AzureStorageConnector

    hashtag
    Application Insights

    • ApplicationInsights integration

    • AI suffix for Api/GetReport

    • AI opt-out

    hashtag
    Web2 Master Support

    • Added Web2 master support

    • Web2 CDN/Master caching/fallback logic (#192)

    hashtag
    SCIM Completeness

    • SCIM extensions for completer API

    • Expose more information on Group members

    hashtag
    Fixes

    • Fixed issue #187

    • Fixed issue #186

    • Fixed issue #191

    • Fixed issue #193

    hashtag
    Maintenance

    • Refactored WebController.Api method to CustomApiController.Handle

    • Expose ExecuteAction parameters on ChartArgs

    • Allow ProjectedType for view entities

    hashtag
    May 2018

    hashtag
    New Features

    hashtag
    User Notifications & Jobs (#177)

    • User notifications server side + Jobs

    • Extra user notifications communication

    • WebSocket updates

    hashtag
    Short/Hash IDs

    • Added ShortIds

    • Added UnhashShortId extension method

    • Renamed ShortObjectId to HashObjectId

    • More methods to work with short ids (for instant search)

    hashtag
    Builder Features

    • Expose POActions.CheckDetailRules in reference implementation

    • Added ServiceWork flag for Manager.Environment

    hashtag
    Fixes

    • Fixed issue #180

    • Always show DisableTwoFactor for users with Two-factor authentication

    • Return false instead of exception when ValidateAuthToken is called with empty userName

    hashtag
    Maintenance

    • Removed obsolete MigrationHelpers methods

    • Firefox screen capture

    • Filter UserNotification query

    • Expose Query.GroupedBy

    hashtag
    April 2018

    hashtag
    New Features

    hashtag
    Authentication

    • Added AuthenticatorService.GetCredentialRedirectUri

    • Added CredentialTypeArgs.RedirectTo

    • Added Manager.UserCultureInfo

    hashtag
    Builder

    • Added IBuilder.GetPO/GetQ

    hashtag
    Sign-in Experience

    • Extra messages for sign-in experience

    • Updated messages for sign-in experience

    • Use args for GetCredentialType call

    hashtag
    Fixes

    • Fixed issue #173

    • Fixed issue #176

    • Fixed HasGetCredentialType detection

    • Fixed AmbigiousException on viSearch

    hashtag
    Maintenance

    • Basic retry logic when uploading to azure storage

    • Not-"stay signed in" gives authtoken for 12h by default

    • Expose HttpStatusCode in WebsiteArgs

    hashtag
    March 2018

    hashtag
    New Features

    hashtag
    Computed Attributes

    • Added computed attributes

    • Don't get computed attribute for IsNew if no explicit New visibility

    hashtag
    Authentication & Security

    • Added require change password

    • Added IUser HasPassword/RemovePassword/ResetPasswordNextLogin

    • Flag application as having sensitive data

    hashtag
    Swagger/OpenAPI

    • Added SwaggerUI dist

    • Handle Swagger Definitions (arguments/responses/...)

    • Swagger changes

    hashtag
    API Features

    • Added CustomApiController.OnPreApi hook

    • Added Manager.LogEntry

    hashtag
    Fixes

    • Fixed issue #156

    • Fixed issue #157

    • Fixed issue #161 - word repeating nested sections

    • Fixed issue #168

    hashtag
    Maintenance

    • Return AuthToken as header when received as header

    • WebException can have null Response

    • Fixed issue in .NET example in reports doc

    hashtag
    February 2018

    hashtag
    New Features

    hashtag
    Two-Factor Authentication

    • Added Group.TwoFactorRequired

    • Allow TwoFactorRequired on system groups

    • Don't show DisableTwoFactor for user that requires Two-factor

    hashtag
    Sensitive Data

    • Is sensitive flag on attribute and query column

    • Flag Vidyano User attributes as sensitive

    • Add IsSensitive to sensitive system settings

    hashtag
    Reporting

    • Added support for tsv reports

    • Allow $where for reports (#150)

    hashtag
    API & Security

    • Added viRemovePassword

    • Added Setting.Description

    • Added IExceptionService.LogWarning

    • Expose Path/Operation on SwaggerPathAttribute

    hashtag
    Fixes

    • Fixed issue when deleting attributes that would remove unrelated columns

    • Fixed issue with Feedback misusing IsReadOnly

    • Reset attributes when SaveDetails fails

    hashtag
    Maintenance

    • Missing translations

    • ServicePointManager changes for Web2Cdn

    • Keep PO.IsReadOnly logic when New/BulkEdit/Delete is called directly

    hashtag
    January 2018

    hashtag
    New Features

    hashtag
    API Security

    • Added ApiArgs.IsValidSignature helper method

    • Added diagnostics types info

    hashtag
    Authentication

    • Sliding login rate limiting (#136)

    hashtag
    Word Processing

    • Added Word.ConvertToPdf helper

    hashtag
    SCIM

    • SCIM tweaks

    • Better SCIM support

    hashtag
    Fixes

    • Fixed boolean logic for hidden attributes/detail queries

    hashtag
    Maintenance

    • Updated release notes for 5.30.0

    • Copy-paste issue for SCIM doc

    • Set Default QueryLayoutMode to MasterDetail for new projects


    Note: 2018 was a major year for security enhancements with two-factor authentication, sensitive data handling, online password blacklist checking, and the introduction of the vi-audit system. Performance optimizations and SCIM support were also key focuses.

    5.37.1+3fd7ebea

    Wednesday, July 11th, 2018

    hashtag
    Features

    • Added explicit UnabletToLoadEntityException (requires the System.ServiceModel namespace, latest Visual Studio extension will add it for new projects)

    • New Feature - Improved initial cold-start verbose model loading by reading them as parallel (can be disabled by setting the Vidyano.ModelLoaderMaxDegreeOfParallelism appSetting to 1)

    • New Feature - Added in-preview UserNotifications (repository version has been increased to 59)

    • New Feature - Added extra security layer for entities using an int/long PK by using using per entity salt

    • New Feature - Added implementation for a custom IStorageProvider named FolderStorageProvider

    • New Feature - Added support for Azure Application Insights by adding extra information to the operation names (can be disabled using the Vidyano.DisableApplicationInsights appSetting)

    • New Feature - Added support for providing extra search parameter when getting column distincts

    • New Feature - Added helper method on Manager.LogEntry to hide sensitive information from urls (i.e. token passed to api)

    • New Feature - Made repository schema forward compatible allowing versions starting from this version to connect to repository that are using a newer version

    • New Feature - Added support for using “master” as Web2 version which will use the latest commit as web2 client (for testing purposes, not supported for production environments)

    • New Feature - Added throttling when too many UnableToLoadEntityExceptions are thrown by a single user

    hashtag
    Changes

    • Expose Manager.UserCultureInfo

    • Expose PersistentObjectAttribute.DisplaySum getter

    • Include original stacktrace when logging EF exceptions

    hashtag
    Fixes

    • Fixed AmbigiousException on viSearch

    • Fixed issue with web2 cdn proxy on Owin hosting

    • Fixed issue when multiple instance tried to update the same repository (load-balancer first run for new version)

    5.6.4+151e2e

    Wednesday, January 18th, 2017

    hashtag
    Features

    • Added PO.RemoveAttribute/AddQuery/RemoveQuery

    • Added support for Cognitive Services token for translations

    • Added ITranslationService

    • Added ?lang=CODE support for reports

    hashtag
    Changes

    • Use IDbSet/IObjectSet to discover context property

    • Increased entropy for new report tokens

    hashtag
    Fixes

    • Fixed issue with new language being kept on error

    • Fixed allow bulk-edit detection when working with base POActions class

    • Fixed issue with new Data Type not saving correctly

    Actions classes

    This information is still applicable to v6

    This page provides some common scenarios to use the PersistentObjectActions class.

    hashtag
    Soft Delete

    By default, Vidyano will tell Entity Framework to delete an entity from the target context when the end user uses the Delete action. We can override this behavior so that the entity is not actually deleted but only marked as deleted (e.g. disabled, not active, obsolete, …).

    hashtag
    Cascade Delete

    Another common scenario is to delete related entities when a master entity is deleted (in most cases this can also be done on the database using cascade delete on the foreign key).

    hashtag
    Auditing

    Setting audit attributes can be easily implemented by using the UpdateEntity method to set the attributes.

    hashtag
    External services

    If we need to inform another external service about new or updated entities we can use the following code.

    5.31.2+c8aabb2

    Monday, February 5th, 2018

    hashtag
    Features

    • Added column to show which users have Two-factor enabled and “Disable two-factor” action for admins to unlink Two-factor on a user

    5.18.0+de3495

    hashtag
    Features

    • Moved legacy old Web code to separate Vidyano.Service.Legacy NuGet package

    5.8.1+67bcab

    Monday, February 13th, 2017

    hashtag
    Changes

    • Changed cors handler to use * for allowed origin

    Labels

    This information is still applicable to v6, for the code snippet, the Manager.Current.GetTranslatedMessage("Disable") can also be replaced with Messages.Disabled

    For custom actions a developer can choose the label that should be used, but for the system actions like Save or Delete the labels have always been fixed for an application. The ActionLabels feature allows you to change the Label for the system actions using code.

    hashtag
    Example

    Best Practices

    Note: This documentation has been updated for v6. Please refer to the documentation for the latest information.

    If your deployment allows for configuring settings outside of the source code (e.g. the Application Settings tab on Microsoft Azure App Services) then this can be used to configure a set of application settings that even the developers won’t have access to.

    • Configure another ApplicationSalt (via the Vidyano.ApplicationSalt app setting)

    Overriding Vidyano Settings

    circle-info

    This information is still applicable to v6 but you should use the .NET core related configuration providers, so any of the configured providers can be used (appsettings.json, environment variables, user secrets, ...), the key to set will be Vidyano:Setting e.g. Vidyano:MicrosoftTranslatorAppId

    Vidyano has always used 2 places to store settings, the web.config appSettings section for settings that required the application to restart, and the Settings repository table for settings that can be changed at runtime.

    This new feature allows you to override the settings stored in the Settings repository table using the web.config appSettings section. This can be used for system settings and custom settings.

    Security

    Note: This documentation has been updated for v6. Please refer to the documentation for the latest information.

  • Updated DocumentFormat.OpenXml (reverted to 2.7.2 for compatibility)

  • Updated Newtonsoft.Json to 12.0.1

  • Updated NuGet packages

  • Builder changes

  • Optimized IsAllowed checking
  • Performance improvements throughout

  • Fixed NRE when Sorting on reference property with invalid DisplayAttribute

  • Fixed issue when saving new DataType

  • Extra profiling info during different Construct phases of PO
  • Skip logic faster for attributes that aren't used anyway

  • GetGroupingInfo hook

  • Split GetObjectAsync/GetObjects

  • Also update AI operation name for GetPO/GetQuery during exception

  • Set empty Actions array for LightConstruct Query

  • Also flag notification as read when archiving

  • Ensure POActions are disposed

  • Ensure we copy data from AggregateException when logging exception

  • Chart tweaks

  • Also log method that was used for a failed request

  • Strip zero width spaces from user names

  • HandleUnknownWebsocketMessage hook

  • Show extra groups that aren't in the security.json file

  • Force ExportToCsv to use BOM

  • Obsoletes clean up

  • Ignore I/O exception from WebSocketException

  • Added Manager.GetLogsSince

  • Handle empty ObjectId for viAudit
  • Allow adding of viAudit UserRight

  • Persist changed attributes after unchanged
    Tweaked Height for LogVerboseData Data attr
  • Use C# 7.2

  • Fallback to default sorting when sort fails
  • Fixed issue with custom AddReference action needing Edit rights

  • Don't reuse ObjectContext for DbQueries

  • Updated docs
  • Changed logic for creating new context in POActions/AsyncCustomAction

  • Added ActionLabels docs

  • Also show non-database SqlErrors to end-users

  • Show error when viRestartApp failed

  • Don't use ReadContext when executing Vidyano queries

  • Removed duplicate right

  • Diagnostics: Handle case where GenerateMessage throws a ValidationException

  • Added WebsiteArgs.Redirect method

  • Enabled applicationInitialization

  • Fixed issue #199

  • Fixed issue #202

  • Fixed issue #204

  • Fixed issue #205

  • Fixed issue for detecting 4.7.1, added detection for 4.7.2

  • Fixed model load for invalid query columns

  • Fixed issue with handling PUT request (SCIM)

  • Fixed issue with caching during QueryResultItem reflection

  • Fixed caching issue logic on QueryResultItem property

  • Don't show stack traces to end-users

  • Redirect to Web2 CDN by default instead of proxying the requests
  • Replace all web2/* imports (except vulcanize) with direct cdn links

  • SqlDependency logging and cleanup

  • Don't use JsonPoolConvert for VisualStudioIntegration

  • Use WebsiteRoot in docs

  • Made System.Buffers usage opt-in

  • Ignore some WebSocket related exceptions

  • Invalid usage on ReportService when System.Buffers is not available

  • Added JsonPoolConvert.DeserializeObject

  • SCIM: allow PATCH/PUT user.Name

  • Missing notification duration in some methods as parameter

  • TODO cleanup

  • Handle duplicate patch import, ignoring applied change

  • Updated grouping docs

  • Added MaybeArrayPool

  • Fixed issue when getting SAS for blobName with special characters

  • Don't allow groups for Manager.DeleteUser

  • Renamed AzureAD to SAML2
  • Skip "EntityFramework: " prefix for generic log-id message

  • Make sure we update the cache when verifying authToken

  • Skip total/count/chart for Report/Excel/Word

  • Don't log GlobalSearch parent as IsSystem entry

  • Fixed issue with Web2 version setting not allowing http anymore

  • Correctly suggest custom query methods

  • Allow Search parameter for QueryFilter.RefreshColumn

  • Added helpers to replace sensitive url information

  • AI: ExecuteAction operation suffix should be set sooner

  • Added missing references in default new Vidyano project

  • WIP #179

  • Fixed Add menu not working when opening solution directly #179

  • Made Builder compatible again with VS2015

  • Updated Azure Blob Service Rest API version

  • Always allow TLS 1.1 and 1.2

  • Improved Web2Cdn speed

  • Set parent IsNew/ObjectId before calling OnConstruct for POAWR

  • Removed version override support on web2 endpoint

  • Add logging information to ExecuteQuery when an exception is thrown

  • Fixed projected type check
  • Updated security docs

  • Cache DynamicBase referenced type lookup

  • Use ProjectedType iso ReferencedType attribute

  • Added hook to handle custom path for patch user replace operation

  • Show New feedback as dialog

  • Try to use browser acceptlanguage for Sign in screen

  • Don't log ConnectWebSocket in verbose logs

  • Duplicate TS definition

  • Added FolderStorageProvider class

  • Added UnableToLoadEntityException
  • Fixed issue with #176 not displaying correctly on diagnostics page

  • Fixed Web2 issue with Owin hosting

  • Fixed issue with loadbalancer when trying to add missing settings

  • Added SCIM User/Group filtering
  • Allow custom sql errors to be shown to end-users

  • Verify two-factor after checking password

  • Also filter SCIM get group

  • Perf change for cleaning up vidyano logs

  • Don't get computed attribute for IsNew if no explicit New visibility

  • Authenticate should update cache first

  • Don't double save new feedback

  • Test code prefer ACS for enabled user with no password

  • Security docs update

  • Use PO Type for UnableToLoadEntityException if label is empty

  • Allow custom label/objectId for UnableToLoadEntityException

  • Made POA.DisplaySum public getter

  • Include original stack trace for EF exceptions

  • Added LoadBalancer tester project

  • Updated ConfigureAwaitChecker.Analyzer dev dependency

  • Parallel model loading

  • Added LoginArgs.HasSensitive
  • Added support for online password blacklist check

  • Changed CheckOnlinePasswordBlacklist to opt-out

  • Fixed issue #171

  • Fixed issue #108

  • Fixed issue when verbose logger in database received invalid content

  • Fixed issue with ResetPasswordNextLogin not showing password attribute

  • Fixed issue when saving existing filter

  • Fixed issue with VPD on POAWR using enumerable source

  • Log auto-resume exceptions as Warning
  • Always return a HttpResponseMessage

  • Increase pwnedpasswords api timeout to 10s

  • Added extra reserved words

  • Default usings for [Schema]Web

  • Added extra help message when trying to save new virtual PO

  • Hide Advanced ACS methods

  • Validate actual password change for ResetPasswordNextLogin

  • Attach failed sign-in log to user when user exists

  • Consistent EOL for all files

  • Expose user parameter in Manager.Log

  • Ignore TaskCancelledException in Web2Cdn.CacheVersion

  • Minimize timing attacks against unknown users

  • Trim incoming userName

  • Throw SaveFailedException when OnSave fails

  • Handle ResetPasswordNextLogin for users without password

  • Throw SaveFailed in SaveExisting/SaveNew/SaveDetails

  • Ensure profiler has correct value when returning

  • Trim instant search input

  • Added POA.CanGroupBy

  • Don't expose sensitive database information

  • Use secure random string for salt

  • Allow HEAD /Poll

  • Added option to Include count for Query PUI

  • Added localNameSelector for PieChart

  • Handle = null difference between DynamicLambda and EntitySQL

  • Expose current application root uri

  • Don't expose SqlException to non-Administrator users

  • Hide Code attribute when disabling newly two-factor

  • Actually fixed #108

  • Handle sorting of TranslatedString on DB

  • Required SQL for generating dummy function

  • Also pass parent correctly when checking VPD

  • Manager.Current.User can be null

  • Skip MemberOf check if not cached

  • Move GetGroupingInfo to POActions

  • Fixed issue with ComputeTotalItems not working for PageSize=0

  • Fixed cast issue in GetGroupingInfo

  • Changed default expiration from 2/28 days to 1/2 days

  • Added ApiMethodAttribute.TryAuthentication

  • Added PO.IsBreadcrumbSensitive
  • Flag application as having sensitive data

  • Also flag UserHostAddress and RequestId as sensitive

  • Made POA.ToolTip settable

  • Fixed POAWRBuilder not saving
  • Fixed issue #152

  • Fixed issue with OnNew flagging PO as IsBreadcrumbSensitive

  • Fixed ArgumentNullException when saving User without filling in username

  • Some exceptions can be ignored
  • Expose WordprocessingDocument in Word.Generate V2

  • Ensure Manager is initialized for ACS/OAuth/Authenticate request

  • Hide System.Linq/System.Collections.Generic namespace in typediagnostics

  • Added notification on New User to inform to which group it will be added

  • Reverted back to EF 6.1.3

  • Added ObjectEx.GetSHA512

  • Fixed issue with OAuth/ACS calling Advanced.GetClientIpAddress twice

  • Added docs favicon

  • Fixed invalid seed SQL script

  • Profiler changes

  • Added Manager.OriginalUser

  • Keep OriginalUser when impersonating again

  • Fixed custom azure table queries

  • Log feedback as original user

  • Tweaked default builder classes

  • Updated Builder

  • Only need to add extension once

  • Synchronize changes

  • Log api method name in verbose logs

  • Remove user rights when deleting query

  • Use new height typehints

  • Show enum options for nullable enum

  • Prefer GetAwaiter().GetResult() instead of .Result

  • Removed unneeded LINQ call

  • Hide some obsolete classes/properties

  • Let Manager.GetUser return null for null or empty name

  • Handle images as binary

  • Updated security docs

  • Added support for online password blacklist check

  • Allow setting of response headers for index html request

  • Check all groups instead of only direct groups

  • Removed obsolete migrations

  • Support UserName/AuthToken in Authorization header

  • Fixed issue when using bulk-edit on Users
  • Fixed issue when using bulk-edit on UserRights

  • Fixed issue when using bulk-edit on PersistentObjects

  • Don’t send HSTS header when running on localhost

  • Added Group.TwoFactorRequired to indicate that all users in that group require Two-factor authentication
  • Added “Remove password” action on users with a password so that they can only login using external authentication providers (or impersonate)

  • Added optional Setting.Description to describe the usage of the custom setting

  • Added Word.ConvertToPdf helper (requires key from 2sky)

  • Added ScimCredentials.AllowedOperations to disable specific scim operations if needed (i.e. allow a token to only read user/group data but not modify it)

  • Added new /diagnostics/types helper page to determine what .NET types/methods are used for custom queries/custom actions/POActions

  • Switched to an ip based throttling for checking password during authentication (1 try per second) (app setting Vidyano.MaxLoginTries, e.g. 1/5 for 1 try every 5 seconds or 10/1 for 10 tries every second, use 0/0 to disable throttling)

  • Added ApiArgs.IsValidSignature method to check for same AuthorizationSignature based authentication as reports

  • Added notification when creating new User to inform to which group it will be added

  • Added string.GetSHA512() extension method

  • hashtag
    Changes

    • Expose WordProcessingDocument on WordArgs

    • Setting PO.IsReadOnly in Management part will now also check this for New/BulkEdit/Delete action calls

    • Removed override on ServicePointManager.SecurityProtocol in favor of default .NET configuration

    • Changed User settings screen to require current two-factor code when disabling two-factor

    • Changed Default QueryLayoutMode setting to MasterDetail for new projects

    • Reverted EntityFramework NuGet dependency back to 6.1.3

    hashtag
    Fixes

    • Fixed issue when removing an attribute that would also remove unrelated columns with the same name

    • Fixed issue with new sync option for hidden attributes and detail queries

    • Ensure Vidyano is initialized when it receives authentication requests (OAuth/ACS/…)

    hashtag
    Fixes
    • Fixed issue with web2 vulcanize resource when it only has read access

    • Fixed issue with Regenerate token action being shown on read-only report

    • Fixed issue with Read right being required for OnPreviewAction

    hashtag
    Fixes
    • Fixed issue with exception in custom Web class constructor not being logged correctly

    Always show DisableTwoFactor action in management for users with Two-factor enabled (can be used to reset two-factor token)
  • Expose Query.GroupedBy

  • Expose PersistentObjectActions.CheckDetailRules in reference implementation

  • Return false when ValidateAuthToken is called with empty userName (instead of exception)

  • Added ServiceWorker flag as possible ClientEnvironment

  • Expose hook for custom paths during scim patch user operation

  • Show New feedback as dialog

  • Try to use browser acceptlanguage for Sign-in screen (during GetClientData)

  • Support AccountSAS for AzureStorageConnecto

  • Export ExecuteAction’s parameters on ChartArgs

  • Renamed AzureAD authentication provider to SAML2

  • Skip “EntityFramework: “ prefix for generic log-id message

  • Skip total/count/chart for Report/Excel/Word

  • Extended scim support to provide more correct information ($ref/location)

  • Updated Azure Blob Service REST api version to 2017-11-09

  • Fixed issue when invalid Web2 version was used in settings by validating version before saving
  • Fixed issue when getting SAS for a blobName with special characters

  • Fixed issue with invalid custom query methods being suggested

  • Fixed entropy issue when using Hashids

  • hashidsarrow-up-right
    v6 Security
    protected override void MarkForDeletion(Customer entity)
    {
        //Context.DeleteObject(entity);
        entity.IsActive = false;
    }
    Changing the Delete label on a Persistent object that has soft-delete enabled.

    Another use case for changing the Save label is when a virtual persistent object is shown for a custom action.

    public override void OnConstruct(Query query, PersistentObject parent)
    {
    	base.OnConstruct(query, parent);
    
    	query.ActionLabels["Delete"] = Manager.Current.GetTranslatedMessage("Disable"); // Or "Revoke"/"Deactivate"/"Remove"
    }
    public override void OnNew(PersistentObject obj, PersistentObject parent, Query query, Dictionary<string, string> parameters)
    {
        base.OnNew(obj, parent, query, parameters);
    
        obj.ActionLabels["Save"] = obj.Label;
    }
    protected override void MarkForDeletion(Customer entity)
    {
        Context.DeleteObject(entity);
        foreach (var address in entity.Addresses)
            Context.DeleteObject(address);
    }
    protected override void UpdateEntity(PersistentObject obj, Customer entity)
    {
        if (obj.IsNew)
        {
            obj[nameof(Customer.CreatedOn)] = Manager.Current.Now;
            obj[nameof(Customer.CreatedBy)] = Manager.Current.User.Id;
        }
        obj[nameof(Customer.ModifiedOn)] = Manager.Current.Now;
        obj[nameof(Customer.ModifiedBy)] = Manager.Current.User.Id;
    
        base.UpdateEntity(obj, entity);
    }
    protected override void PopulateAfterPersist(PersistentObject obj, Customer entity)
    {
        base.PopulateAfterPersist(obj, entity);
    
        var wasNew = obj.IsNew; // The entity will have the correct DB primary key at this moment
        ExternalService.PostCustomer(wasNew, entity);
    }
    Set the DiagnosticsToken to a secure random string (Vidyano.Diagnostics token)
  • Use a different set of credentials/connection string for the database

  • If configured, use another connection string for verbose logging

  • Enable the Vidyano.ForceHttps app setting to enable HSTS

  • Configure TLS 1.2 to be the minimum TLS version

  • Disable the admin user and use another named user that is an administrator or make sure that the password is strong (and different from development)

  • hashtag
    Automation protection

    If the web app is available on the public internet and can be accessed without logging in (e.g. contact form) you should provide extra protection against abuse. This can easily be done by using the Google reCaptcha library to validate the request.

    hashtag
    External Audit

    Vidyano has been externally audited by The Security Factory, you can read the report here (2023)arrow-up-right, here (2018)arrow-up-right, here (2014)arrow-up-right.

    “Overall Security Posture

    Based on our experience we would rate the security posture of the application in the higher regions of good security.”

    v6 Security - Best Practices
    Overridden settings will be shown as read-only in the Management part.

    <appSettings>
      <add key="Vidyano.MicrosoftTranslatorAppId" value="xxx" />
    </appSettings>