Skip to content

Commit

Permalink
Support Claims
Browse files Browse the repository at this point in the history
User page support all default identity properties
  • Loading branch information
shps951023 committed May 20, 2024
1 parent 86edff5 commit bcfe133
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 68 deletions.
24 changes: 12 additions & 12 deletions src/Frontend_Identity/src/views/EndpointsView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
<th>
{{ $t("Route") }}
</th>
<th>{{ $t("Redirect") }}</th>
<th>{{ $t("Enable") }}</th>
<th>{{ $t("Roles") }}</th>
<th>{{ $t("Action") }}</th>
<!-- <th>{{ $t("Redirect") }}</th> -->
<!-- <th>{{ $t("Enable") }}</th> -->
<!-- <th>{{ $t("Roles") }}</th> -->
<!-- <th>{{ $t("Action") }}</th> -->
</tr>
</thead>
<tbody>
Expand All @@ -23,19 +23,19 @@
<td>
{{ item.Route }}
</td>
<td>
<!-- <td>
<div class="form-check form-switch">
<input :disabled="item.Type == 'miniauth'" class="form-check-input" type="checkbox"
v-model="item.RedirectToLoginPage">
</div>
</td>
</td> -->

<td>
<!-- <td>
<div class="form-check form-switch">
<input :disabled="item.Type == 'miniauth'" class="form-check-input" type="checkbox" v-model="item.Enable">
</div>
</td>
<td>
</td> -->
<!-- <td>
<div class="resizable" >
<div class=" form-check" v-for="(role, index) in roles" :key="index">
<input :disabled="item.Type == 'miniauth' || role.Enable==false" class="role_checkbox form-check-input" type="checkbox"
Expand All @@ -44,8 +44,8 @@
<label class="form-check-label" :for="'role_' + index">{{ role.Name }}</label>
</div>
</div>
</td>
<td>
</td> -->
<!-- <td>
<button :disabled="item.Type == 'miniauth'" class="btn" @click="saveEndpoint(item)">
<svg width="20px" height="20px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="System / Save">
Expand All @@ -55,7 +55,7 @@
</g>
</svg>
</button>
</td>
</td> -->
</tr>
</tbody>
</table>
Expand Down
105 changes: 75 additions & 30 deletions src/Frontend_Identity/src/views/UsersView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -26,40 +26,25 @@
<table class="table table-hover">
<thead>
<tr class="table-dark">
<th>{{ $t("Action") }}</th>
<th>{{ $t("UserName") }}</th>
<th>{{ $t("Roles") }}</th>
<th>{{ $t("Email") }}</th>
<th>{{ $t("PhoneNumber") }}</th>
<th>{{ $t("FirstName") }}</th>
<th>{{ $t("LastName") }}</th>
<th hidden>Email</th>
<th>{{ $t("Employee_Number") }}</th>
<th>{{ $t("Enable") }}</th>
<th>{{ $t("Action") }}</th>
<th>{{ $t("Email Confirmed") }}</th>
<th>{{ $t("PhoneNumber Confirmed") }}</th>
<th>{{ $t("Two Factor Enabled") }}</th>
<th>{{ $t("Lockout Enabled") }}</th>
<th>{{ $t("Lockout End") }}</th>
<th>{{ $t("Access Failed Count") }}</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in users" :key="index">
<td>
<input class="input_no_border" type="text" v-model="item.Username">
</td>
<td>
<div class="resizable" style="height: 25px;scroll-behavior: smooth;overflow-y: auto;">
<div class=" form-check" v-for="(role, index) in roles" :key="index">
<input :disabled="item.Type == 'miniauth' || role.Enable == false" class="role_checkbox form-check-input"
type="checkbox" :value="role.Id" v-model="item.Roles">
<label class="form-check-label" :for="'role_' + index">{{ role.Name }}</label>
</div>
</div>
</td>
<td>
<input class="input_no_border" type="text" v-model="item.First_name">
</td>
<td>
<input class="input_no_border" type="text" v-model="item.Last_name">
</td>
<td>
<div class="form-check form-switch">
<input :disabled="item.Type == 'miniauth'" class="form-check-input" type="checkbox" v-model="item.Enable">
</div>
</td>
<td>
<button class="btn" @click="openEditModal(item)">
<svg width="20px" height="20px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
Expand Down Expand Up @@ -104,6 +89,64 @@
<path d="M9 5C9 3.89543 9.89543 3 11 3H13C14.1046 3 15 3.89543 15 5V7H9V5Z" stroke="#000000"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg></button>
</td>
<td>
<input class="input_no_border" type="text" v-model="item.Username">
</td>
<td>
<div class="resizable" style="height: 25px;scroll-behavior: smooth;overflow-y: auto;">
<div class=" form-check" v-for="(role, index) in roles" :key="index">
<input :disabled="item.Type == 'miniauth' || role.Enable == false" class="role_checkbox form-check-input"
type="checkbox" :value="role.Id" v-model="item.Roles">
<label class="form-check-label" :for="'role_' + index">{{ role.Name }}</label>
</div>
</div>
</td>
<td>
<input class="input_no_border" type="mail" v-model="item.Mail">
</td>
<td>
<input class="input_no_border" type="text" v-model="item.PhoneNumber">
</td>
<td>
<input class="input_no_border" type="text" v-model="item.First_name">
</td>
<td>
<input class="input_no_border" type="text" v-model="item.Last_name">
</td>
<td>
<input class="input_no_border" type="text" v-model="item.Emp_no">
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" v-model="item.Enable">
</div>
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" v-model="item.EmailConfirmed">
</div>
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" v-model="item.PhoneNumberConfirmed">
</div>
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" v-model="item.TwoFactorEnabled">
</div>
</td>
<td>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" v-model="item.LockoutEnabled">
</div>
</td>
<td>
<input class="input_no_border" type="datetime-local" v-model="item.LockoutEnd">
</td>
<td>
<input readonly class="input_no_border" type="text" v-model="item.AccessFailedCount">
</td>
</tr>
</tbody>
Expand Down Expand Up @@ -140,8 +183,8 @@
</div>
<div class="modal-body">
<form v-if="isModalOpen">
<label for="firstName">{{ $t("UserName") }}:</label>
<input class="form-control" type="text" v-model="editedUser.Username" id="firstName" required>
<label for="userName">{{ $t("UserName") }}:</label>
<input class="form-control" type="text" v-model="editedUser.Username" id="userName" required>

<label for="roles">{{ $t("Roles") }}:</label>
<div style="height: 100px;scroll-behavior: smooth;overflow-y: auto;">
Expand All @@ -164,7 +207,7 @@

<label for="enable">{{ $t("Enable") }}:</label>
<div class="form-check form-switch">
<input :disabled="editedUser.Type == 'miniauth'" class="form-check-input" type="checkbox"
<input class="form-check-input" type="checkbox"
v-model="editedUser.Enable">
</div>
</form>
Expand Down Expand Up @@ -207,10 +250,12 @@
input[type="mail"] {
widows: 100%;
border: 0;
border-bottom: 1px solid black;
/* border-bottom: 1px solid black; */
outline: 0;
background-color: rgba(226, 226, 226, 0.744);
/* background-color: rgba(226, 226, 226, 0.744); */
}
/* input type=text or mail */
</style>

<script setup>
Expand Down
112 changes: 94 additions & 18 deletions src/MiniAuth.IdentityAuth/MiniAuthIdentityEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Routing;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MiniAuth.IdentityAuth.Helpers;
Expand Down Expand Up @@ -119,13 +120,30 @@ TDbContext _dbContext
var pageIndex = root.GetProperty<int>("pageIndex");
var pageSize = root.GetProperty<int>("pageSize");
var offset = pageIndex * pageSize;
var users = _dbContext.Users.Skip(offset).Take(pageSize)
.Select(s => new
{
Id = s.Id,
Username = s.UserName,
Mail = s.Email,
Roles = _dbContext.UserRoles.Where(w => w.UserId == s.Id).Select(s => s.RoleId).ToArray(),
var users = _dbContext.Users.Skip(offset).Take(pageSize).ToArray()
.Select(s => {
var claims = _dbContext.UserClaims.Where(w => w.UserId == s.Id).ToArray();
var result = new
{
Id = s.Id,
Username = s.UserName,
Mail = s.Email,
EmailConfirmed = s.EmailConfirmed,
PhoneNumber = s.PhoneNumber,
PhoneNumberConfirmed = s.PhoneNumberConfirmed,
TwoFactorEnabled = s.TwoFactorEnabled,
LockoutEnd = s.LockoutEnd?.ToString("yyyy-MM-ddTHH:mm"),
LockoutEnabled = s.LockoutEnabled,
AccessFailedCount = s.AccessFailedCount,

Roles = _dbContext.UserRoles.Where(w => w.UserId == s.Id).Select(s => s.RoleId).ToArray(),

First_name = claims.FirstOrDefault(f => f.ClaimType == "First_name")?.ClaimValue,
Last_name = claims.FirstOrDefault(f => f.ClaimType == "Last_name")?.ClaimValue,
Enable = claims.FirstOrDefault(f => f.ClaimType == "Enable")?.ClaimValue == "True",
Emp_no = claims.FirstOrDefault(f => f.ClaimType == "Emp_no")?.ClaimValue,
};
return result;
});
var totalItems = _dbContext.Users.Count();
await OkResult(context, new { users, totalItems }.ToJson());
Expand All @@ -145,39 +163,97 @@ TDbContext _dbContext
var emp_no = root.GetProperty<string>("Emp_no");
var mail = root.GetProperty<string>("Mail");
var enable = root.GetProperty<bool>("Enable");
var EmailConfirmed = root.GetProperty<bool>("EmailConfirmed");
var PhoneNumberConfirmed = root.GetProperty<bool>("PhoneNumberConfirmed");
var PhoneNumber = root.GetProperty<string>("PhoneNumber");
var TwoFactorEnabled = root.GetProperty<bool>("TwoFactorEnabled");
var LockoutEnd = root.GetProperty<DateTimeOffset>("LockoutEnd");
var LockoutEnabled = root.GetProperty<bool>("LockoutEnabled");
var roles = root.GetProperty<string[]>("Roles");
var type = root.GetProperty<string>("Type");
TIdentityUser user = (TIdentityUser)await _dbContext.Users.FindAsync(id);

var isUserExist = user == null;
if (isUserExist)
{
user = new TIdentityUser
{
UserName = username,
Email = mail,
EmailConfirmed= EmailConfirmed,
PhoneNumberConfirmed= PhoneNumberConfirmed,
PhoneNumber= PhoneNumber,
TwoFactorEnabled= TwoFactorEnabled,
LockoutEnd = LockoutEnd,
LockoutEnabled= LockoutEnabled,

};
await _dbContext.Users.AddAsync(user);
}
else
{
user.UserName = username;
user.Email = mail;
user.EmailConfirmed = EmailConfirmed;
user.PhoneNumberConfirmed = PhoneNumberConfirmed;
user.PhoneNumber = PhoneNumber;
user.TwoFactorEnabled = TwoFactorEnabled;
user.LockoutEnd = LockoutEnd;
user.LockoutEnabled = LockoutEnabled;
}
await _dbContext.SaveChangesAsync();

var userRoles = _dbContext.UserRoles.Where(w => w.UserId == user.Id).ToArray();
foreach (var userRole in userRoles)
// remove not in roles, add new roles, keep old roles, update roles
{
_dbContext.UserRoles.Remove(userRole);
var roleIds = _dbContext.Roles.Select(s => s.Id).ToArray();
foreach (var item in roles)
{
if (!roleIds.Contains(item))
continue;
var userRole = userRoles.FirstOrDefault(f => f.RoleId == item);
if (userRole == null)
{
userRole = new IdentityUserRole<string>
{
UserId = user.Id,
RoleId = item,
};
await _dbContext.UserRoles.AddAsync(userRole);
}
}
foreach (var item in userRoles)
{
if (!roles.Contains(item.RoleId))
{
_dbContext.UserRoles.Remove(item);
}
}
}
foreach (var role in roles)

var userClaims = _dbContext.UserClaims.Where(w => w.UserId == user.Id).ToArray();
{
var userRole = new IdentityUserRole<string>
string[] keys = new[] { "First_name", "Last_name", "Emp_no", "Enable" };
foreach (var item in keys)
{
UserId = user.Id,
RoleId = role
};
await _dbContext.UserRoles.AddAsync(userRole);
}
var userClaim = userClaims.FirstOrDefault(f => f.ClaimType == item);
var val = root.GetProperty<object>(item);
if (val == null)
continue;
if (userClaim == null)
{
userClaim = new IdentityUserClaim<string>
{
UserId = user.Id,
ClaimType = item,
ClaimValue = val?.ToString(),
};
await _dbContext.UserClaims.AddAsync(userClaim);
}
else
{
userClaim.ClaimValue = val?.ToString();
}
}
};

if (isUserExist)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,6 @@ private static OptionsBuilder<CookieAuthenticationOptions> AddMiniAuthApplicatio
{
builder.AddCookie(IdentityConstants.ApplicationScheme, o =>
{

#if DEBUG
//o.Cookie.SameSite = SameSiteMode.None;
//o.Cookie.Path = "/";
//o.Cookie.SecurePolicy = CookieSecurePolicy.None;
//o.Cookie.SameSite = SameSiteMode.None;
//o.Cookie.HttpOnly = false;
#endif
o.LoginPath = new PathString("/Account/Login");
o.Events = new CookieAuthenticationEvents
{
Expand Down

0 comments on commit bcfe133

Please sign in to comment.