Skip to content

Commit cf37e99

Browse files
committed
Add asp.net core 3.x sample project.
1 parent d4fc9e0 commit cf37e99

File tree

80 files changed

+41656
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+41656
-0
lines changed

DynamicRoleBasedAuthorization.sln

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicRoleBasedAuthorizati
99
EndProject
1010
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicAuthorization.Mvc.JsonStore", "src\DynamicAuthorization.Mvc.JsonStore\DynamicAuthorization.Mvc.JsonStore.csproj", "{3E397C28-EDC7-4DCC-896F-476A9EE74E76}"
1111
EndProject
12+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A7EEBB7E-C64D-4475-93D0-872E080A4E03}"
13+
EndProject
14+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{BAAF9837-1DB5-4032-AB2A-2901E6EE6EF8}"
15+
EndProject
16+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "netcore3.x", "netcore3.x", "{5FEB9007-1EFA-4814-BC15-DB0370B84E22}"
17+
EndProject
18+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleMvcWebApp", "samples\netcore3.x\SampleMvcWebApp\SampleMvcWebApp.csproj", "{0833E296-398F-42A4-9531-D125483AB019}"
19+
EndProject
1220
Global
1321
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1422
Debug|Any CPU = Debug|Any CPU
@@ -27,10 +35,20 @@ Global
2735
{3E397C28-EDC7-4DCC-896F-476A9EE74E76}.Debug|Any CPU.Build.0 = Debug|Any CPU
2836
{3E397C28-EDC7-4DCC-896F-476A9EE74E76}.Release|Any CPU.ActiveCfg = Release|Any CPU
2937
{3E397C28-EDC7-4DCC-896F-476A9EE74E76}.Release|Any CPU.Build.0 = Release|Any CPU
38+
{0833E296-398F-42A4-9531-D125483AB019}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39+
{0833E296-398F-42A4-9531-D125483AB019}.Debug|Any CPU.Build.0 = Debug|Any CPU
40+
{0833E296-398F-42A4-9531-D125483AB019}.Release|Any CPU.ActiveCfg = Release|Any CPU
41+
{0833E296-398F-42A4-9531-D125483AB019}.Release|Any CPU.Build.0 = Release|Any CPU
3042
EndGlobalSection
3143
GlobalSection(SolutionProperties) = preSolution
3244
HideSolutionNode = FALSE
3345
EndGlobalSection
46+
GlobalSection(NestedProjects) = preSolution
47+
{89E57FDC-5AF7-4AAF-A40B-FBA91D41ECF4} = {A7EEBB7E-C64D-4475-93D0-872E080A4E03}
48+
{3E397C28-EDC7-4DCC-896F-476A9EE74E76} = {A7EEBB7E-C64D-4475-93D0-872E080A4E03}
49+
{5FEB9007-1EFA-4814-BC15-DB0370B84E22} = {BAAF9837-1DB5-4032-AB2A-2901E6EE6EF8}
50+
{0833E296-398F-42A4-9531-D125483AB019} = {5FEB9007-1EFA-4814-BC15-DB0370B84E22}
51+
EndGlobalSection
3452
GlobalSection(ExtensibilityGlobals) = postSolution
3553
SolutionGuid = {18C80710-C9E9-488B-9100-1E4BF8B18038}
3654
EndGlobalSection
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
using DynamicAuthorization.Mvc.Core;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Identity;
4+
using Microsoft.AspNetCore.Mvc;
5+
using Microsoft.EntityFrameworkCore;
6+
using SampleMvcWebApp.Areas.Access.Models;
7+
using System.ComponentModel;
8+
using System.Linq;
9+
using System.Threading.Tasks;
10+
11+
namespace SampleMvcWebApp.Areas.Access.Controllers
12+
{
13+
[Area("Access"), Authorize]
14+
[DisplayName("Role Management")]
15+
public class RoleController : Controller
16+
{
17+
private readonly IMvcControllerDiscovery _mvcControllerDiscovery;
18+
private readonly IRoleAccessStore _roleAccessStore;
19+
private readonly RoleManager<IdentityRole> _roleManager;
20+
21+
public RoleController(
22+
IMvcControllerDiscovery mvcControllerDiscovery,
23+
IRoleAccessStore roleAccessStore,
24+
RoleManager<IdentityRole> roleManager
25+
)
26+
{
27+
_mvcControllerDiscovery = mvcControllerDiscovery;
28+
_roleManager = roleManager;
29+
_roleAccessStore = roleAccessStore;
30+
}
31+
32+
// GET: Role
33+
[DisplayName("Role List")]
34+
public async Task<ActionResult> Index()
35+
{
36+
var roles = await _roleManager.Roles.ToListAsync();
37+
38+
return View(roles);
39+
}
40+
41+
[DisplayName("Create Role")]
42+
// GET: Role/Create
43+
public ActionResult Create()
44+
{
45+
var controllers = _mvcControllerDiscovery.GetControllers();
46+
ViewData["Controllers"] = controllers;
47+
48+
return View();
49+
}
50+
51+
// POST: Role/Create
52+
[HttpPost, ValidateAntiForgeryToken]
53+
public async Task<ActionResult> Create(RoleViewModel viewModel)
54+
{
55+
if (!ModelState.IsValid)
56+
{
57+
ViewData["Controllers"] = _mvcControllerDiscovery.GetControllers();
58+
return View(viewModel);
59+
}
60+
61+
var role = new IdentityRole { Name = viewModel.Name };
62+
var result = await _roleManager.CreateAsync(role);
63+
64+
if (!result.Succeeded)
65+
{
66+
foreach (var error in result.Errors)
67+
ModelState.AddModelError("", error.Description);
68+
69+
ViewData["Controllers"] = _mvcControllerDiscovery.GetControllers();
70+
return View(viewModel);
71+
}
72+
73+
if (viewModel.SelectedControllers != null && viewModel.SelectedControllers.Any())
74+
{
75+
foreach (var controller in viewModel.SelectedControllers)
76+
foreach (var action in controller.Actions)
77+
action.ControllerId = controller.Id;
78+
79+
var roleAccess = new RoleAccess
80+
{
81+
Controllers = viewModel.SelectedControllers,
82+
RoleId = role.Id
83+
};
84+
await _roleAccessStore.AddRoleAccessAsync(roleAccess);
85+
}
86+
87+
return RedirectToAction(nameof(Index));
88+
}
89+
90+
// GET: Role/Edit/5
91+
[DisplayName("Edit Role")]
92+
public async Task<ActionResult> Edit(string id)
93+
{
94+
ViewData["Controllers"] = _mvcControllerDiscovery.GetControllers();
95+
var role = await _roleManager.FindByIdAsync(id);
96+
if (role == null)
97+
return NotFound();
98+
99+
var accessList = await _roleAccessStore.GetRoleAccessAsync(role.Id);
100+
var viewModel = new RoleViewModel
101+
{
102+
Name = role.Name,
103+
SelectedControllers = accessList?.Controllers
104+
};
105+
106+
return View(viewModel);
107+
}
108+
109+
// POST: Role/Edit/5
110+
[HttpPost, ValidateAntiForgeryToken]
111+
public async Task<ActionResult> Edit(string id, RoleViewModel viewModel)
112+
{
113+
if (!ModelState.IsValid)
114+
{
115+
ViewData["Controllers"] = _mvcControllerDiscovery.GetControllers();
116+
return View(viewModel);
117+
}
118+
119+
// Check role exit
120+
var role = await _roleManager.FindByIdAsync(id);
121+
if (role == null)
122+
{
123+
ModelState.AddModelError("", "Role not found");
124+
ViewData["Controllers"] = _mvcControllerDiscovery.GetControllers();
125+
return View();
126+
}
127+
128+
// Update role if role's name is changed
129+
if (role.Name != viewModel.Name)
130+
{
131+
role.Name = viewModel.Name;
132+
var result = await _roleManager.UpdateAsync(role);
133+
if (!result.Succeeded)
134+
{
135+
foreach (var error in result.Errors)
136+
ModelState.AddModelError("", error.Description);
137+
138+
ViewData["Controllers"] = _mvcControllerDiscovery.GetControllers();
139+
return View(viewModel);
140+
}
141+
}
142+
143+
// Update role access list
144+
if (viewModel.SelectedControllers != null && viewModel.SelectedControllers.Any())
145+
{
146+
foreach (var controller in viewModel.SelectedControllers)
147+
foreach (var action in controller.Actions)
148+
action.ControllerId = controller.Id;
149+
}
150+
151+
var roleAccess = new RoleAccess
152+
{
153+
Controllers = viewModel.SelectedControllers,
154+
RoleId = role.Id
155+
};
156+
await _roleAccessStore.EditRoleAccessAsync(roleAccess);
157+
158+
return RedirectToAction(nameof(Index));
159+
}
160+
161+
// POST: Role/Delete/5
162+
[HttpDelete("role/{id}")]
163+
public async Task<ActionResult> Delete(string id)
164+
{
165+
var role = await _roleManager.FindByIdAsync(id);
166+
if (role == null)
167+
{
168+
ModelState.AddModelError("Error", "Role not found");
169+
return BadRequest(ModelState);
170+
}
171+
172+
var result = await _roleManager.DeleteAsync(role);
173+
if (!result.Succeeded)
174+
{
175+
foreach (var error in result.Errors)
176+
ModelState.AddModelError("Error", error.Description);
177+
178+
return BadRequest(ModelState);
179+
}
180+
181+
await _roleAccessStore.RemoveRoleAccessAsync(role.Id);
182+
183+
return Ok(new { });
184+
}
185+
}
186+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using DynamicAuthorization.Mvc.Core;
2+
using System.Collections.Generic;
3+
using System.ComponentModel.DataAnnotations;
4+
5+
namespace SampleMvcWebApp.Areas.Access.Models
6+
{
7+
public class RoleViewModel
8+
{
9+
[Required]
10+
[StringLength(256, ErrorMessage = "The {0} must be at least {2} characters long.")]
11+
public string Name { get; set; }
12+
13+
public IEnumerable<MvcControllerInfo> SelectedControllers { get; set; }
14+
}
15+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
@model RoleViewModel
2+
@{
3+
ViewData["Title"] = "Create Role";
4+
var controllers = (IEnumerable<MvcControllerInfo>)ViewData["Controllers"];
5+
}
6+
7+
<h2>Create Role</h2>
8+
9+
<hr />
10+
11+
<div class="row">
12+
<div class="col-md-6">
13+
<form asp-action="Create">
14+
<div asp-validation-summary="All" class="text-danger"></div>
15+
16+
<div class="form-group row">
17+
<label asp-for="Name" class="col-md-2 col-form-label"></label>
18+
<div class="col-md-10">
19+
<input asp-for="Name" class="form-control" />
20+
<span asp-validation-for="Name" class="text-danger"></span>
21+
</div>
22+
</div>
23+
24+
<div class="form-group row">
25+
<label class="col-md-3 col-form-label">Access List</label>
26+
<div class="col-md-9">
27+
<ol id="tree">
28+
@foreach (var controller in controllers)
29+
{
30+
var name = controller.DisplayName ?? controller.Name;
31+
32+
<li class="controller" data-value="@controller.Name">
33+
<input type="hidden" class="area" value="@controller.AreaName" />
34+
@name
35+
@if (controller.Actions.Any())
36+
{
37+
<ul>
38+
@foreach (var action in controller.Actions)
39+
{
40+
name = action.DisplayName ?? action.Name;
41+
<li data-value="@action.Name">@name</li>
42+
}
43+
</ul>
44+
}
45+
</li>
46+
}
47+
</ol>
48+
</div>
49+
</div>
50+
<div class="form-group">
51+
<input type="submit" value="Create" class="btn btn-primary" />
52+
</div>
53+
</form>
54+
</div>
55+
</div>
56+
57+
<div>
58+
<a asp-action="Index">Back to List</a>
59+
</div>
60+
61+
@section Scripts {
62+
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
63+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
@model RoleViewModel
2+
@{
3+
ViewData["Title"] = "Edit Role";
4+
var controllers = (IEnumerable<MvcControllerInfo>)ViewData["Controllers"];
5+
}
6+
7+
<h2>Edit Role</h2>
8+
9+
<hr />
10+
11+
<div class="row">
12+
<div class="col-md-6">
13+
<form asp-action="Edit">
14+
<div asp-validation-summary="All" class="text-danger"></div>
15+
16+
<div class="form-group row">
17+
<label asp-for="Name" class="col-md-2 col-form-label"></label>
18+
<div class="col-md-10">
19+
<input asp-for="Name" class="form-control" />
20+
<span asp-validation-for="Name" class="text-danger"></span>
21+
</div>
22+
</div>
23+
24+
<div class="form-group">
25+
<label class="col-md-3 col-form-label">Access List</label>
26+
<div class="col-md-9">
27+
<ol id="tree">
28+
@foreach (var controller in controllers)
29+
{
30+
var selectedController = Model?.SelectedControllers?.SingleOrDefault(c => c.Id == controller.Id);
31+
var name = controller.DisplayName ?? controller.Name;
32+
33+
<li class="controller" data-value="@controller.Name">
34+
35+
<input type="hidden" class="area" value="@controller.AreaName" />
36+
@name
37+
@if (controller.Actions.Any())
38+
{
39+
<ul>
40+
@foreach (var action in controller.Actions)
41+
{
42+
{
43+
name = action.DisplayName ?? action.Name;
44+
}
45+
<li data-value="@action.Name"
46+
@if (selectedController != null && selectedController.Actions.Any(a => a.Id == action.Id)) { <text> data-checked='1' </text> }>
47+
@name
48+
</li>
49+
}
50+
</ul>
51+
}
52+
</li>
53+
}
54+
</ol>
55+
</div>
56+
</div>
57+
<div class="form-group">
58+
<input type="submit" value="Edit" class="btn btn-primary" />
59+
</div>
60+
</form>
61+
</div>
62+
</div>
63+
64+
<div>
65+
<a asp-action="Index">Back to List</a>
66+
</div>
67+
68+
@section Scripts {
69+
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
70+
}

0 commit comments

Comments
 (0)