Here is our WebModule configuration.
PreConfigure<OpenIddictBuilder>(builder =>
{
_ = builder.AddValidation(options =>
{
_ = options.AddAudiences("SafetyPlusWeb");
_ = options.UseLocalServer();
_ = options.UseAspNetCore();
});
});
if (!hostingEnvironment.IsDevelopment())
{
PreConfigure<AbpOpenIddictAspNetCoreOptions>(options =>
{
options.AddDevelopmentEncryptionAndSigningCertificate = false;
});
PreConfigure<OpenIddictServerBuilder>(serverBuilder =>
{
// In production, it is recommended to use two RSA certificates,
// one for encryption, one for signing.
_ = serverBuilder.AddEncryptionCertificate(
GetEncryptionCertificate(context.Services.GetConfiguration()));
_ = serverBuilder.AddSigningCertificate(
GetSigningCertificate(context.Services.GetConfiguration()));
});
var domainFormat = GetDomainFormatForEnvironment(hostingEnvironment);
PreConfigure<AbpOpenIddictWildcardDomainOptions>(options =>
{
options.EnableWildcardDomainSupport = true;
_ = options.WildcardDomainsFormat.Add($"https://{domainFormat}");
_ = options.WildcardDomainsFormat.Add($"https://{domainFormat}/signin-oidc");
_ = options.WildcardDomainsFormat.Add($"https://{domainFormat}/signout-callback-oidc");
});
}
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
var domainFormat = GetDomainFormatForEnvironment(hostingEnvironment);
Configure<AbpTenantResolveOptions>(options =>
{
options.AddDomainTenantResolver(domainFormat);
});
if (!configuration.GetValue<bool>("App:DisablePII"))
{
Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;
}
if (!configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata"))
{
Configure<OpenIddictServerAspNetCoreOptions>(options =>
{
options.DisableTransportSecurityRequirement = true;
});
}
if (!hostingEnvironment.IsDevelopment())
{
_ = context.Services.AddSignalR(options =>
{
options.AddFilter<AbpMultiTenantHubFilter>();
}).AddAzureSignalR();
}
ConfigureOptions(context, configuration);
ConfigureAuthentication(context);
ConfigureUrls(configuration);
ConfigureBundles();
ConfigureImpersonation(context, configuration);
ConfigureAutoMapper();
ConfigureVirtualFileSystem(hostingEnvironment);
ConfigureMultiTenancy();
ConfigureSwaggerServices(context.Services);
ConfigureExternalProviders(context, configuration);
ConfigureAutoApiControllers();
ConfigureBlazorise(context);
ConfigureRouter(context);
ConfigureMenu(context);
ConfigureCookieConsent(context);
ConfigureAuditingOptions(context);
ConfigureTheme();
Configure<SettingManagementComponentOptions>(options =>
{
options.Contributors.Add(new SafetyPlusWebSettingsComponentContributor());
});
if (!hostingEnvironment.IsDevelopment())
{
Configure<AbpTenantResolveOptions>(options =>
{
options.AddDomainTenantResolver(domainFormat);
});
}
}
```
Is it possible to bypass the "My Account" page with the linked account module and instead return directly to the previously opened page?
Is it possible to seed linked accounts to a new user. For example allowing a support user to login to any account using linked accounts.
We need to permission role based access to files and folders in the File Management module. Can you please provide any recommendations on how to accomplish?
Thanks
1.BuildClaims(HttpContext context) at Microsoft.Azure.SignalR.NegotiateHandler
1.Process(HttpContext context)
at Microsoft.Azure.SignalR.ServiceRouteHelper.RedirectToService[THub](HttpContext context, IList1 authorizationData) at Microsoft.Azure.SignalR.NegotiateMatcherPolicy.<>c__7
1.<b__7_0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|7_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Volo.Abp.AspNetCore.Serilog.AbpSerilogMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.Auditing.AbpAuditingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Volo.Abp.AspNetCore.Security.Claims.AbpDynamicClaimsMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.Uow.AbpUnitOfWorkMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.MultiTenancy.MultiTenancyMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Builder.ApplicationBuilderAbpOpenIddictMiddlewareExtension.<>c__DisplayClass0_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Volo.Abp.AspNetCore.Security.AbpSecurityHeadersMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.Tracing.AbpCorrelationIdMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.RequestLocalization.AbpRequestLocalizationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
[22:23:30 INF] Request finished HTTP/2 POST https://localhost:44354/_blazor/negotiate?negotiateVersion=1 - 500 null text/plain; charset=utf-8 142.9569msTrying to add AzureSignalR by following these articles https://support.abp.io/QA/Questions/2054/Using-Azure-SignalR-backplane-for-abp-Blazor-app https://support.abp.io/QA/Questions/4993/Issue-Implementing-Azure%27s-Managed-SignalR-service-with-an-ABP-Blazor-Server-application
Current configuration
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
context.Services.AddSignalR(options =>
{
options.AddFilter<AbpMultiTenantHubFilter>();
})
.AddAzureSignalR(options =>
{
options.ServerStickyMode = Microsoft.Azure.SignalR.ServerStickyMode.Required;
options.ClaimsProvider = context => new[]
{
new Claim(ClaimTypes.NameIdentifier, "testing123")
};
options.ConnectionString = "Endpoint=[redacted]";
});
.......
}
public class AbpMultiTenantHubFilter : IHubFilter
{
public virtual async ValueTask<object?> InvokeMethodAsync(HubInvocationContext invocationContext, Func<HubInvocationContext, ValueTask<object?>> next)
{
var currentPrincipalAccessor = invocationContext.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
if (invocationContext.Context.User == null)
throw new NullReferenceException(nameof(invocationContext.Context.User));
using (currentPrincipalAccessor.Change(invocationContext.Context.User))
{
var tenantId = currentPrincipalAccessor.Principal.FindTenantId();
string? tenantName = null;
if (tenantId != null)
{
tenantName = (await invocationContext.ServiceProvider.GetRequiredService<ITenantStore>().FindAsync(tenantId.Value))?.Name;
}
using (invocationContext.ServiceProvider.GetRequiredService<ICurrentTenant>().Change(currentPrincipalAccessor.Principal.FindTenantId(), tenantName))
{
return await next(invocationContext);
}
}
}
public virtual Task OnConnectedAsync(HubLifetimeContext context, Func<HubLifetimeContext, Task> next)
{
return Task.CompletedTask;
}
public virtual Task OnDisconnectedAsync(HubLifetimeContext context, Exception? exception, Func<HubLifetimeContext, Exception, Task> next)
{
return Task.CompletedTask;
}
}
We built a button dropdown component designed to control visibility of columns on the Blazorise DataGrid.
This component works fine when embedded in the body of the page. We would like to move the button to the Toolbar to keep the look and feel consistent.
We are having trouble figuring out how to access event callbacks from the toolbar contributor.
We try to add the component like this but the event callbacks don't work.
var arguments = new Dictionary<string, object?>();
arguments.Add("SelectAllCheckedValue", SelectAllCheckedValue);
arguments.Add("TestDateCheckedValue", TestDateCheckedValue);
arguments.Add("AttachmentsCheckedValue", AttachmentsCheckedValue);
arguments.Add("AttachmentsCheckedValueChanged", AttachmentsCheckedValueChanged);
Toolbar.AddComponent<SubstanceAbuseTestsDataGridColumnVisibilityComponent>(arguments);
Here is the component referenced on the razor page.
<DataGridColumnVisibilityComponent @bind-SelectAllCheckedValue=SelectAllCheckedValue
@bind-TestDateCheckedValue=TestDateCheckedValue
@bind-AttachmentsCheckedValue=AttachmentsCheckedValue />
Here is the code behind c#
protected bool TestDateCheckedValue { get; set; }
protected bool AttachmentsCheckedValue { get; set; }
protected bool SelectAllCheckedValue { get; set; }
protected async Task SetColumnVisibilityAsync()
{
// ToDo bind cookie here
SelectAllCheckedValue = true;
TestDateCheckedValue = true;
AttachmentsCheckedValue = true;
} protected bool TestDateCheckedValue { get; set; }
protected bool AttachmentsCheckedValue { get; set; }
protected bool SelectAllCheckedValue { get; set; }
protected async Task SetColumnVisibilityAsync()
{
// ToDo bind cookie here
SelectAllCheckedValue = true;
TestDateCheckedValue = true;
AttachmentsCheckedValue = true;
}
Here is the component.
@page "/DataGridColumnVisibility"
<Dropdown>
<DropdownToggle Color="Color.Primary">
<Icon Name="IconName.Eye" /> Field Visibility
</DropdownToggle>
<DropdownMenu >
<DropdownItem ShowCheckbox Checked="SelectAllCheckedValue" CheckedChanged="UpdateSelectAllCheckedValue">Select All</DropdownItem>
<DropdownDivider />
<DropdownItem ShowCheckbox Checked="TestDateCheckedValue" CheckedChanged="UpdateTestDateCheckedValue">Test Date</DropdownItem>
<DropdownItem ShowCheckbox Checked="AttachmentsCheckedValue" CheckedChanged="UpdateAttachmentsCheckedValue">Attachments</DropdownItem>
</DropdownMenu>
</Dropdown>
@code {
[Parameter]
public bool SelectAllCheckedValue { get; set; }
[Parameter]
public EventCallback<bool> SelectAllCheckedValueChanged { get; set; }
async Task UpdateSelectAllCheckedValue()
{
SelectAllCheckedValue = !SelectAllCheckedValue;
TestDateCheckedValue = SelectAllCheckedValue;
AttachmentsCheckedValue = SelectAllCheckedValue;
await SelectAllCheckedValueChanged.InvokeAsync(SelectAllCheckedValue);
await TestDateCheckedValueChanged.InvokeAsync(TestDateCheckedValue);
await AttachmentsCheckedValueChanged.InvokeAsync(AttachmentsCheckedValue);
}
[Parameter]
public bool TestDateCheckedValue { get; set; }
[Parameter]
public EventCallback<bool> TestDateCheckedValueChanged { get; set; }
protected async Task UpdateTestDateCheckedValue()
{
TestDateCheckedValue = !TestDateCheckedValue;
await TestDateCheckedValueChanged.InvokeAsync(TestDateCheckedValue);
}
[Parameter]
public bool AttachmentsCheckedValue { get; set; }
[Parameter]
public EventCallback<bool> AttachmentsCheckedValueChanged { get; set; }
protected async Task UpdateAttachmentsCheckedValue()
{
AttachmentsCheckedValue = !AttachmentsCheckedValue;
await AttachmentsCheckedValueChanged.InvokeAsync(AttachmentsCheckedValue);
}
}
We use this on the Displayable property of the DataGrid column
<DataGridColumn TItem="ExampleDto"
Field="TestDate"
Displayable=TestDateCheckedValue
Editable="true"
Caption="@L["TestDate"]">
<DisplayTemplate>
@context.TestDate.ToShortDateString()
</DisplayTemplate>
</DataGridColumn>
[Parameter]
public EventCallback<bool> AttachmentsCheckedValueChanged { get; set; }
protected async Task UpdateAttachmentsCheckedValue()
{
AttachmentsCheckedValue = !AttachmentsCheckedValue;
await AttachmentsCheckedValueChanged.InvokeAsync(AttachmentsCheckedValue);
}
}