├── .gitignore
├── BlazorReCaptchaSample.sln
├── BlazorServerEdition
└── Server
│ ├── App.razor
│ ├── BlazorReCaptchaSample.Server.csproj
│ ├── Pages
│ ├── Step1.razor
│ ├── Step2.razor
│ └── _Host.cshtml
│ ├── Program.cs
│ ├── Properties
│ └── launchSettings.json
│ ├── ReCAPTCHA.razor
│ ├── SampleAPI.cs
│ ├── Startup.cs
│ ├── _Imports.razor
│ ├── appsettings.json
│ ├── reCAPTCHAVerificationOptions.cs
│ ├── reCAPTCHAVerificationResponse.cs
│ └── wwwroot
│ ├── favicon.ico
│ ├── scripts
│ ├── script.js
│ ├── script.js.map
│ └── script.ts
│ └── style.css
├── BlazorWasmEdition
├── Client
│ ├── App.razor
│ ├── BlazorReCaptchaSample.Client.csproj
│ ├── Pages
│ │ ├── Step1.razor
│ │ └── Step2.razor
│ ├── Program.cs
│ ├── Properties
│ │ ├── AssemblyInfo.cs
│ │ └── launchSettings.json
│ ├── ReCAPTCHA.razor
│ ├── SampleSite.Components.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── scripts
│ │ ├── script.js
│ │ ├── script.js.map
│ │ └── script.ts
│ │ └── style.css
├── Host
│ ├── BlazorReCaptchaSample.Host.csproj
│ ├── Controllers
│ │ └── SampleAPIController.cs
│ ├── Program.cs
│ ├── Properties
│ │ ├── PublishProfiles
│ │ │ └── blazor-recaptcha-sample - Web Deploy.pubxml
│ │ └── launchSettings.json
│ ├── Startup.cs
│ ├── appSettings.json
│ ├── reCAPTCHAVerificationOptions.cs
│ └── reCAPTCHAVerificationResponse.cs
└── Shared
│ ├── BlazorReCaptchaSample.Shared.csproj
│ └── SampleAPIArgs.cs
├── LICENSE
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/
2 | obj/
3 | .vs/
4 | *.user
5 | *.suo
6 | appSettings.Development.json
7 |
--------------------------------------------------------------------------------
/BlazorReCaptchaSample.sln:
--------------------------------------------------------------------------------
1 | Microsoft Visual Studio Solution File, Format Version 12.00
2 | # Visual Studio Version 16
3 | VisualStudioVersion = 16.0.0.0
4 | MinimumVisualStudioVersion = 16.0.0.0
5 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorReCaptchaSample.Host", "BlazorWasmEdition\Host\BlazorReCaptchaSample.Host.csproj", "{6E1E976D-315B-461F-8A47-DC6C0D69FEA8}"
6 | EndProject
7 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorReCaptchaSample.Client", "BlazorWasmEdition\Client\BlazorReCaptchaSample.Client.csproj", "{E4F5C735-BB90-4C44-8B6D-B7723A985B38}"
8 | EndProject
9 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorReCaptchaSample.Shared", "BlazorWasmEdition\Shared\BlazorReCaptchaSample.Shared.csproj", "{0341B023-80E5-4FEA-B58E-CD70D1D432EC}"
10 | EndProject
11 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "- README -", "- README -", "{DA112AC4-9D16-4397-BD7D-570BEDAD7142}"
12 | ProjectSection(SolutionItems) = preProject
13 | LICENSE = LICENSE
14 | README.md = README.md
15 | EndProjectSection
16 | EndProject
17 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Blazor WebAssmbly App (Client-Side Blazor) Edition", "Blazor WebAssmbly App (Client-Side Blazor) Edition", "{3E8808D4-3993-4261-ADAD-6A4D1493FB9F}"
18 | EndProject
19 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Blazor Server App (Server-Side Blazor) Edition", "Blazor Server App (Server-Side Blazor) Edition", "{466F4BCB-AC3D-48D5-837C-8D00F4C56C7F}"
20 | EndProject
21 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorReCaptchaSample.Server", "BlazorServerEdition\Server\BlazorReCaptchaSample.Server.csproj", "{ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}"
22 | EndProject
23 | Global
24 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
25 | Debug|Any CPU = Debug|Any CPU
26 | Debug|x64 = Debug|x64
27 | Debug|x86 = Debug|x86
28 | Release|Any CPU = Release|Any CPU
29 | Release|x64 = Release|x64
30 | Release|x86 = Release|x86
31 | EndGlobalSection
32 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
33 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
34 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
35 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Debug|x64.ActiveCfg = Debug|Any CPU
36 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Debug|x64.Build.0 = Debug|Any CPU
37 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Debug|x86.ActiveCfg = Debug|Any CPU
38 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Debug|x86.Build.0 = Debug|Any CPU
39 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
40 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Release|Any CPU.Build.0 = Release|Any CPU
41 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Release|x64.ActiveCfg = Release|Any CPU
42 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Release|x64.Build.0 = Release|Any CPU
43 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Release|x86.ActiveCfg = Release|Any CPU
44 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8}.Release|x86.Build.0 = Release|Any CPU
45 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
46 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Debug|Any CPU.Build.0 = Debug|Any CPU
47 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Debug|x64.ActiveCfg = Debug|Any CPU
48 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Debug|x64.Build.0 = Debug|Any CPU
49 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Debug|x86.ActiveCfg = Debug|Any CPU
50 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Debug|x86.Build.0 = Debug|Any CPU
51 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Release|Any CPU.ActiveCfg = Release|Any CPU
52 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Release|Any CPU.Build.0 = Release|Any CPU
53 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Release|x64.ActiveCfg = Release|Any CPU
54 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Release|x64.Build.0 = Release|Any CPU
55 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Release|x86.ActiveCfg = Release|Any CPU
56 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38}.Release|x86.Build.0 = Release|Any CPU
57 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
58 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
59 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Debug|x64.ActiveCfg = Debug|Any CPU
60 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Debug|x64.Build.0 = Debug|Any CPU
61 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Debug|x86.ActiveCfg = Debug|Any CPU
62 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Debug|x86.Build.0 = Debug|Any CPU
63 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
64 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Release|Any CPU.Build.0 = Release|Any CPU
65 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Release|x64.ActiveCfg = Release|Any CPU
66 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Release|x64.Build.0 = Release|Any CPU
67 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Release|x86.ActiveCfg = Release|Any CPU
68 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC}.Release|x86.Build.0 = Release|Any CPU
69 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
70 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Debug|Any CPU.Build.0 = Debug|Any CPU
71 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Debug|x64.ActiveCfg = Debug|Any CPU
72 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Debug|x64.Build.0 = Debug|Any CPU
73 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Debug|x86.ActiveCfg = Debug|Any CPU
74 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Debug|x86.Build.0 = Debug|Any CPU
75 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Release|Any CPU.ActiveCfg = Release|Any CPU
76 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Release|Any CPU.Build.0 = Release|Any CPU
77 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Release|x64.ActiveCfg = Release|Any CPU
78 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Release|x64.Build.0 = Release|Any CPU
79 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Release|x86.ActiveCfg = Release|Any CPU
80 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47}.Release|x86.Build.0 = Release|Any CPU
81 | EndGlobalSection
82 | GlobalSection(SolutionProperties) = preSolution
83 | HideSolutionNode = FALSE
84 | EndGlobalSection
85 | GlobalSection(NestedProjects) = preSolution
86 | {6E1E976D-315B-461F-8A47-DC6C0D69FEA8} = {3E8808D4-3993-4261-ADAD-6A4D1493FB9F}
87 | {E4F5C735-BB90-4C44-8B6D-B7723A985B38} = {3E8808D4-3993-4261-ADAD-6A4D1493FB9F}
88 | {0341B023-80E5-4FEA-B58E-CD70D1D432EC} = {3E8808D4-3993-4261-ADAD-6A4D1493FB9F}
89 | {ABC16D06-9390-4A40-AE8A-BA6DEBD70A47} = {466F4BCB-AC3D-48D5-837C-8D00F4C56C7F}
90 | EndGlobalSection
91 | GlobalSection(ExtensibilityGlobals) = postSolution
92 | SolutionGuid = {12616DCF-E921-48CA-A211-A262FA10D5E9}
93 | EndGlobalSection
94 | EndGlobal
95 |
--------------------------------------------------------------------------------
/BlazorServerEdition/Server/App.razor:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Sorry, there's nothing at this address.
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/BlazorServerEdition/Server/BlazorReCaptchaSample.Server.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netcoreapp3.1
5 |
6 |
7 |
8 |
9 |
10 | all
11 | runtime; build; native; contentfiles; analyzers; buildtransitive
12 |
13 |
14 |
15 |
16 | ES2015
17 | React
18 | None
19 | True
20 | True
21 | True
22 |
23 |
24 | False
25 | True
26 | True
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/BlazorServerEdition/Server/Pages/Step1.razor:
--------------------------------------------------------------------------------
1 | @page "/"
2 | @inject IJSRuntime JS
3 | @inject NavigationManager Navigation
4 | @inject SampleAPI SampleAPI
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
16 | @code {
17 |
18 | private ReCAPTCHA reCAPTCHAComponent;
19 |
20 | private bool ValidReCAPTCHA = false;
21 |
22 | private bool ServerVerificatiing = false;
23 |
24 | private bool DisablePostButton => !ValidReCAPTCHA || ServerVerificatiing;
25 |
26 | private void OnSuccess()
27 | {
28 | ValidReCAPTCHA = true;
29 | }
30 |
31 | private void OnExpired()
32 | {
33 | ValidReCAPTCHA = false;
34 | }
35 |
36 | private async Task OnClickPost()
37 | {
38 | if (ValidReCAPTCHA)
39 | {
40 | var response = await reCAPTCHAComponent.GetResponseAsync();
41 | try
42 | {
43 | ServerVerificatiing = true;
44 | StateHasChanged();
45 | var result = await SampleAPI.Post(response);
46 | if (result.Success)
47 | {
48 | Navigation.NavigateTo("/valid");
49 | }
50 | else
51 | {
52 | await JS.InvokeAsync