-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathIndex.cshtml
More file actions
89 lines (77 loc) · 3.71 KB
/
Index.cshtml
File metadata and controls
89 lines (77 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
@model StatelessCaptchaModel
@{
ViewData["Title"] = "Stateless Captcha Example";
}
<div class="text-center">
<h1 class="display-4">Stateless Captcha Example</h1>
<p>This example shows how to use stateless captcha that works in clustered environments.</p>
</div>
<div class="row">
<div class="col-md-6 offset-md-3">
<div class="card">
<div class="card-header">
<h5>Stateless Captcha Form</h5>
</div>
<div class="card-body">
<form asp-action="Index" method="post" id="stateless-form">
<div class="form-group mb-3">
<label>Captcha Image:</label>
<div class="d-flex align-items-center">
<img id="captcha-image" src="" alt="Captcha" class="me-2" style="border: 1px solid #ccc;" />
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="refreshCaptcha()">
🔄 Refresh
</button>
</div>
<small class="form-text text-muted">Click refresh to get a new captcha</small>
</div>
<div class="form-group mb-3">
<label asp-for="CaptchaCode">Enter Captcha Code:</label>
<input asp-for="CaptchaCode" class="form-control" placeholder="Enter the code from image" autocomplete="off" />
<span asp-validation-for="CaptchaCode" class="text-danger"></span>
</div>
<input type="hidden" asp-for="CaptchaToken" id="captcha-token" />
<div class="form-group">
<button type="submit" class="btn btn-success">Submit</button>
<a asp-controller="Home" asp-action="Index" class="btn btn-secondary">Session-based Example</a>
<a asp-controller="SharedKeyStateless" asp-action="Index" class="btn btn-primary">Shared Key Example</a>
</div>
</form>
<div class="mt-4">
<h6>Advantages of Stateless Captcha:</h6>
<ul class="small">
<li>✅ Works in clustered/load-balanced environments</li>
<li>✅ No server-side session storage required</li>
<li>✅ Built-in expiration through encryption</li>
<li>✅ Secure token-based validation</li>
<li>✅ Better scalability</li>
<li>✅ Single API call for both token and image</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<script>
async function refreshCaptcha() {
try {
const response = await fetch('/get-stateless-captcha');
const data = await response.json();
// Set the token for validation
document.getElementById('captcha-token').value = data.token;
// Set the image source using base64 data
document.getElementById('captcha-image').src = `data:image/png;base64,${data.imageBase64}`;
// Clear the input
document.getElementById('CaptchaCode').value = '';
} catch (error) {
console.error('Error refreshing captcha:', error);
alert('Failed to load captcha. Please try again.');
}
}
// Initialize captcha on page load
document.addEventListener('DOMContentLoaded', function() {
refreshCaptcha();
});
</script>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}