diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln
index 3811a80ee8..5eda7853a3 100644
--- a/framework/Volo.Abp.sln
+++ b/framework/Volo.Abp.sln
@@ -327,6 +327,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures.Tests", "test\Volo.Abp.GlobalFeatures.Tests\Volo.Abp.GlobalFeatures.Tests.csproj", "{231F1581-AA21-44C3-BF27-51EB3AD5355C}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Client.IdentityModel.WebAssembly", "src\Volo.Abp.Http.Client.IdentityModel.WebAssembly\Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj", "{3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -973,6 +975,10 @@ Global
{231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1138,6 +1144,7 @@ Global
{2CD3B26A-CA81-4279-8D5D-6A594517BB3F} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{04F44063-C952-403A-815F-EFB778BDA125} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{231F1581-AA21-44C3-BF27-51EB3AD5355C} = {447C8A77-E5F0-4538-8687-7383196D04EA}
+ {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}
diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/FodyWeavers.xml b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/FodyWeavers.xml
new file mode 100644
index 0000000000..bc5a74a236
--- /dev/null
+++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/FodyWeavers.xsd b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/FodyWeavers.xsd
new file mode 100644
index 0000000000..3f3946e282
--- /dev/null
+++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj
new file mode 100644
index 0000000000..36838f5149
--- /dev/null
+++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ netstandard2.1
+ Volo.Abp.Http.Client.IdentityModel.WebAssembly
+ Volo.Abp.Http.Client.IdentityModel.WebAssembly
+ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81;
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo/Abp/Http/Client/IdentityModel/WebAssembly/AbpHttpClientIdentityModelWebAssemblyModule.cs b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo/Abp/Http/Client/IdentityModel/WebAssembly/AbpHttpClientIdentityModelWebAssemblyModule.cs
new file mode 100644
index 0000000000..3110c36e26
--- /dev/null
+++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo/Abp/Http/Client/IdentityModel/WebAssembly/AbpHttpClientIdentityModelWebAssemblyModule.cs
@@ -0,0 +1,13 @@
+using System;
+using Volo.Abp.Modularity;
+
+namespace Volo.Abp.Http.Client.IdentityModel.WebAssembly
+{
+ [DependsOn(
+ typeof(AbpHttpClientIdentityModelModule)
+ )]
+ public class AbpHttpClientIdentityModelWebAssemblyModule : AbpModule
+ {
+
+ }
+}
diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo/Abp/Http/Client/IdentityModel/WebAssembly/AccessTokenProviderIdentityModelRemoteServiceHttpClientAuthenticator.cs b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo/Abp/Http/Client/IdentityModel/WebAssembly/AccessTokenProviderIdentityModelRemoteServiceHttpClientAuthenticator.cs
new file mode 100644
index 0000000000..c86fc095c7
--- /dev/null
+++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo/Abp/Http/Client/IdentityModel/WebAssembly/AccessTokenProviderIdentityModelRemoteServiceHttpClientAuthenticator.cs
@@ -0,0 +1,50 @@
+using System.Threading.Tasks;
+using IdentityModel.Client;
+using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Http.Client.Authentication;
+using Volo.Abp.IdentityModel;
+
+namespace Volo.Abp.Http.Client.IdentityModel.WebAssembly
+{
+ [Dependency(ReplaceServices = true)]
+ public class AccessTokenProviderIdentityModelRemoteServiceHttpClientAuthenticator : IdentityModelRemoteServiceHttpClientAuthenticator
+ {
+ protected IAccessTokenProvider AccessTokenProvider { get; }
+
+ public AccessTokenProviderIdentityModelRemoteServiceHttpClientAuthenticator(
+ IIdentityModelAuthenticationService identityModelAuthenticationService,
+ IAccessTokenProvider accessTokenProvider)
+ : base(identityModelAuthenticationService)
+ {
+ AccessTokenProvider = accessTokenProvider;
+ }
+
+ public override async Task Authenticate(RemoteServiceHttpClientAuthenticateContext context)
+ {
+ if (context.RemoteService.GetUseCurrentAccessToken() != false)
+ {
+ var accessToken = await GetAccessTokenFromAccessTokenProviderOrNullAsync();
+ if (accessToken != null)
+ {
+ context.Request.SetBearerToken(accessToken);
+ return;
+ }
+ }
+
+ await base.Authenticate(context);
+ }
+
+ protected virtual async Task GetAccessTokenFromAccessTokenProviderOrNullAsync()
+ {
+ var result = await AccessTokenProvider.RequestAccessToken();
+ if (result.Status != AccessTokenResultStatus.Success)
+ {
+ return null;
+ }
+
+ result.TryGetToken(out var token);
+ return token.Value;
+ }
+ }
+}
diff --git a/nupkg/common.ps1 b/nupkg/common.ps1
index 58b8cf83cf..956e6c8e62 100644
--- a/nupkg/common.ps1
+++ b/nupkg/common.ps1
@@ -93,6 +93,7 @@ $projects = (
"framework/src/Volo.Abp.Http.Client",
"framework/src/Volo.Abp.Http.Client.IdentityModel",
"framework/src/Volo.Abp.Http.Client.IdentityModel.Web",
+ "framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly",
"framework/src/Volo.Abp.Http",
"framework/src/Volo.Abp.IdentityModel",
"framework/src/Volo.Abp.Json",
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj
index d3fec280ba..ace8fe7518 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj
@@ -9,13 +9,12 @@
-
-
+
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
index 8d4e92449f..1538097cb8 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
@@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
-using Volo.Abp.Http.Client.IdentityModel;
+using Volo.Abp.Http.Client.IdentityModel.WebAssembly;
using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName.Blazor
@@ -12,7 +12,7 @@ namespace MyCompanyName.MyProjectName.Blazor
[DependsOn(
typeof(AbpAutofacModule),
typeof(MyProjectNameHttpApiClientModule),
- typeof(AbpHttpClientIdentityModelModule)
+ typeof(AbpHttpClientIdentityModelWebAssemblyModule)
)]
public class MyProjectNameBlazorModule : AbpModule
{
@@ -31,6 +31,7 @@ namespace MyCompanyName.MyProjectName.Blazor
builder.Services.AddOidcAuthentication(options =>
{
builder.Configuration.Bind("AuthServer", options.ProviderOptions);
+ options.ProviderOptions.DefaultScopes.Add("MyProjectName");
});
}
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor
index 000ee6f7f6..801c8d5779 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor
@@ -13,7 +13,7 @@ Welcome to your new app.
Remote Service Test
Current user name: @_userName
-
+
@code
{