Я пытаюсь определить собственный способ Роли пользователей, поскольку моя структура БД для таблицы User имеет следующую структуру:
Роль - это логическое значение, поэтому, если это правда, пользователь является администратором, иначе он обычный пользователь.
Я знаю, что мне нужно объявить add.UseAuthorization() в Startup.cs., и я могу добавить атрибут [Roles = "Administrator"] / [Roles = "User"] внутри Контроллер, но я не уверен, как определить роль, которая будет определяться моим столбцом Роль из таблицы User.
Я искал в Интернете, читал о Политики, но я не думаю, что это правильный способ реализации. Все, что я нашел в Интернете, касается какой-то структуры Личность, но не имеет никакого смысла в том, как прикрепить ее к моему столбцу Роль.
Надеюсь, кто-нибудь может мне помочь. Спасибо!





Если вы можете свободно манипулировать своей БД, я настоятельно рекомендую использовать Идентичность, это мощный фреймворк, который можно интегрировать в вашу собственную базу данных.
Но чтобы конкретно ответить на ваш вопрос, не хватает двух шагов:
[Authorize(Roles = "User")] сможет это уловить.Ниже вы найдете базовый пример использования шаблона ASP.NET Core по умолчанию в Visual Studio.
Добавьте промежуточное ПО аутентификации к вашему методу ConfigureServices и настройте его с помощью AuthenticationScheme. В этом случае я использую аутентификацию с помощью файлов cookie.
//in ConfigureServices, add both middlewares
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
//in the Configure() method, enable these middlewares
app.UseAuthentication();
app.UseCookiePolicy(new CookiePolicyOptions());
Теперь вы готовы к действию. Допустим, у вас есть метод действия, в котором вы хотите аутентифицировать пользователя. Здесь вы хотите преобразовать свою роль, чтобы ее мог распознать [Authorize].
Получите нужную ценность из своей базы данных. В итоге вы получите bool. Преобразуйте ее в роль Claim и добавьте ее в ClaimsIdentity.
bool roleFromDb = true; //this comes from db
//convert to Claim of "Role" type, and create a ClaimsIdentity with it
var adminClaim = new Claim(ClaimTypes.Role, roleFromDb ? "Administrator" : "User");
var claimIdentity = new ClaimsIdentity(new[] { adminClaim },
CookieAuthenticationDefaults.AuthenticationScheme);
//signs in the user and add the ClaimsIdentity which states that user is Admin
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimIdentity));
После этого вы можете пометить другие методы действий с помощью атрибута [Authorize], например:
[Authorize(Roles = "User")]
public IActionResult About() { ... }
[Authorize(Roles = "Administrator")]
public IActionResult Contact() { ... }
Теперь только зарегистрированный пользователь с ролью «Администратор» может посещать страницу контактов.
Проверьте ресурс это для более точной конфигурации используемого промежуточного программного обеспечения.
Да, именно этот ответ я искал, потому что немного запутался в том, что читал ранее. Я также поговорил сегодня со своим наставником, и он рассказал мне о том же, что и в отношении Cookie-файлов и претензий. Спасибо!
Другой способ реализации, основанный на моей базе данных без каких-либо изменений, - это использование заявлений и файлов cookie. Мне удалось это сделать, прочитав следующие документы
Я столкнулся только с одной серьезной проблемой, которая была решена путем чтения это.
Я также добавлю метод входа в систему и строки Startup.cs, чтобы другие могли видеть, как его использовать (если документов недостаточно).
Авторизоваться метод из Контроллер
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(UserModel userModel)
{
if (_iUserBus.LoginUser(userModel))
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, userModel.Email),
new Claim(ClaimTypes.Role, _iUserBus.GetRole(userModel.Email)),
};
ClaimsIdentity userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
var authProperties = new AuthenticationProperties
{
IsPersistent = false,
};
await HttpContext.SignInAsync(principal, authProperties);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("Password", "Email and/or Password wrong");
return View();
}
}
Startup.cs
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
{
options.LoginPath = "/Users/Login";
options.LogoutPath = "/Users/Logout";
});
Надеюсь, это будет полезно всем, кто в этом нуждается.
Это действительно не способ реализовать безопасность. Пожалуйста, прочтите документацию: docs.microsoft.com/nl-nl/aspnet/core/security/…