Skip to content

Commit 04e370a

Browse files
committed
fix: security issues with member profile update and request forgery tokens
1 parent 9359dc2 commit 04e370a

6 files changed

Lines changed: 30 additions & 28 deletions

File tree

SgfDevs/Controllers/AccountController.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
using Umbraco.Cms.Core.Web;
1515
using Umbraco.Cms.Infrastructure.Persistence;
1616
using Umbraco.Cms.Web.Common.Models;
17+
using Umbraco.Cms.Web.Common.Filters;
1718
using Umbraco.Cms.Web.Common.Security;
1819
using Umbraco.Cms.Web.Website.Controllers;
1920

2021
namespace SGFDevs.Controllers;
2122

23+
[AutoValidateAntiforgeryToken]
2224
public class AccountController : SurfaceController
2325
{
2426
private IMemberSignInManager _memberSignInManager;
@@ -84,12 +86,15 @@ public async Task<IActionResult> Login(LoginModel model)
8486
return CurrentUmbracoPage();
8587
}
8688

89+
[HttpPost]
90+
[UmbracoMemberAuthorize]
8791
public async Task<IActionResult> Logout()
8892
{
8993
await _memberSignInManager.SignOutAsync();
9094
return Redirect("/");
9195
}
9296

97+
[HttpPost]
9398
public async Task<IActionResult> Register(RegisterModel model)
9499
{
95100
if (!ModelState.IsValid)
@@ -132,9 +137,24 @@ public async Task<IActionResult> Register(RegisterModel model)
132137
}
133138

134139
[HttpPost]
135-
public IActionResult ProfileUpdate(MemberProfile profile)
140+
[UmbracoMemberAuthorize]
141+
public async Task<IActionResult> ProfileUpdate(MemberProfile profile)
136142
{
137-
var member = _memberService.GetByKey(profile.MemberKey);
143+
var currentMember = await _memberManager.GetCurrentMemberAsync();
144+
if (currentMember == null)
145+
{
146+
return Forbid();
147+
}
148+
149+
var member = _memberService.GetByKey(currentMember.Key);
150+
var fullName = string.Join(" ", new[] { profile.FirstName, profile.LastName }
151+
.Where(value => !string.IsNullOrWhiteSpace(value)));
152+
153+
if (!string.IsNullOrWhiteSpace(fullName))
154+
{
155+
member.Name = fullName;
156+
}
157+
138158
member.Email = profile.Email;
139159
member.SetValue("FirstName", profile.FirstName);
140160
member.SetValue("LastName", profile.LastName);

SgfDevs/ViewModels/MemberProfile.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
using System;
2-
31
namespace SGFDevs.ViewModels;
42

53
public class MemberProfile
64
{
7-
public int MemberId { get; set; }
8-
public Guid MemberKey { get; set; }
95
public string Email { get; set; }
106
public string FirstName { get; set; }
117
public string LastName { get; set; }

SgfDevs/Views/Components/Login/Default.cshtml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
<p>@ViewData["loginWorked"]</p>
1010
@using (Html.BeginUmbracoForm("Login", "Account", FormMethod.Post))
1111
{
12-
@* @Html.AntiForgeryToken() *@
13-
1412
<div class="form">
1513
@Html.ValidationSummary(true)
1614

@@ -39,4 +37,4 @@
3937
}
4038
</div>
4139

42-
<div class="mt_75"></div>
40+
<div class="mt_75"></div>

SgfDevs/Views/Components/Register/Default.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,4 @@
6161
}
6262
</div>
6363

64-
<div class="mt_75"></div>
64+
<div class="mt_75"></div>

SgfDevs/Views/Profile.cshtml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@
4747
<p>Profile updated</p>
4848
}
4949

50-
<form asp-controller="Account" asp-action="ProfileUpdate" method="post">
51-
<input type="hidden" id="MemberId" name="MemberId" value="@member.Id"/>
52-
<input type="hidden" id="MemberKey" name="MemberKey" value="@member.Key"/>
50+
<form asp-controller="Account" asp-action="ProfileUpdate" method="post" asp-antiforgery="true">
5351

5452
<div class="field">
5553
<label for="member.Email">Email</label>
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
1-
@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels;
21
@using Umbraco.Cms.Core.Security
3-
@using Umbraco.Cms.Web.Common.Models
4-
@using Umbraco.Cms.Web.Common.Controllers
52
@inject IMemberManager _memberManager;
63

7-
@{
8-
//var loginStatusModel = Members.GetCurrentLoginStatus();
9-
//var logoutModel = new PostRedirectModel();
10-
}
11-
124
@if (_memberManager.IsLoggedIn())
135
{
146
var currentMember = await _memberManager.GetCurrentMemberAsync();
@@ -17,16 +9,14 @@
179
<a href="/account">@currentMember.Name</a>
1810
</li>
1911
<li>
20-
<a href="/umbraco/surface/account/logout">Logout</a>
21-
@* @using (Html.BeginUmbracoForm<UmbLoginStatusController>("HandleLogout")) *@
22-
@* { *@
23-
@* <button>Logout</button> *@
24-
@* @Html.HiddenFor(m => logoutModel.RedirectUrl) *@
25-
@* } *@
12+
@using (Html.BeginUmbracoForm("Logout", "Account", FormMethod.Post))
13+
{
14+
<button type="submit">Logout</button>
15+
}
2616
</li>
2717
}
2818
else
2919
{
3020
<li><a href="/login">Login</a></li>
3121
<li><a href="/register">Sign Up</a></li>
32-
}
22+
}

0 commit comments

Comments
 (0)