timofeygusevopal
@timofeygusevopal
asp.net core developer

Как правильно прописать Claim для аунтификации?

Пишу небольшое приложение на .net core, возникла проблема, как правильно прописать новый обьект Claim в аунтификации, что бы обращаться к данным, я переопределил что бы обращаться к имени пользователя, но мне надо добавить еще пароль и электронную почту что бы в последствии добавить админку к пользователю
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Project.Models;

namespace RolesApp.Controllers
{
    public class AccountController : Controller
    {
        private ApplicationContext _context;
        public AccountController(ApplicationContext context)
        {
            _context = context;
        }
        [HttpGet]
        public IActionResult Register()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(RegisterModel model)
        {
            if ( ModelState.IsValid)
            {
                User user = await _context.Users.FirstOrDefaultAsync(u => u.Email == model.Email);
                if (user == null)
                {
                    
                    user = new User { Email = model.Email, UserName = model.UserName,  Password = model.Password };
                    Role userRole = await _context.Roles.FirstOrDefaultAsync(r => r.Name == "user");
                    if (userRole != null)
                        user.Role = userRole;

                    _context.Users.Add(user);
                    await _context.SaveChangesAsync();

                    await Authenticate(user); // аутентификация

                    return RedirectToAction("Index", "Home");
                }
                else
                    ModelState.AddModelError("", "Некорректные логин/пароль/вы регистрируетесь повторно");
            }
            return View(model);
        }
        [HttpGet]
        public IActionResult Login()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginModel model)
        {
            if (  ModelState.IsValid)
            {
                User user = await _context.Users
                    .Include(u => u.Role)
                    .FirstOrDefaultAsync(u => u.Email == model.Email && u.Password == model.Password );
                if (user != null)
                {
                    await Authenticate(user); // аутентификация

                    return RedirectToAction("Index", "Home");
                }
                ModelState.AddModelError("", "Некорректные логин и(или) пароль");
            }
            return View(model);
        }
        private async Task Authenticate(User user)
        {
            // создаем один claim
            var claims = new List<Claim>
            {
               // new Claim(ClaimsIdentity.DefaultNameClaimType, user.Email),
                new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name),
                new Claim(ClaimsIdentity.DefaultNameClaimType, user.UserName)
            };

            var Cla = new List<Claim>{
                new Claim(ClaimTypes.Actor, user.UserName)               
            };

          // var claimCla = new ClaimsIdentity(Cla);


            // создаем объект ClaimsIdentity
            ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType,
                ClaimsIdentity.DefaultRoleClaimType);
            // установка аутентификационных куки
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));

            

        }
    }
}
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
@P40b0s
Я использую JWT и добавляю их так:
private ClaimsIdentity GetClaims(User user)
        {
            List<Claim> claims = new List<Claim>();
            claims.Add(new Claim(ClaimTypes.NameIdentifier, user.UserName));
            claims.Add(new Claim(ClaimTypes.Role, user.Role));
            claims.Add(new Claim(CustomClaimsTypes.IsActive, user.IsActive.ToString()));
            return new ClaimsIdentity(claims);
        }


var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject = GetClaims(user),
                    Expires = claimTime,
                    Audience = auth.Audience,
                    Issuer = auth.Issuer,
                    SigningCredentials = auth.Credentials
                };

И получаю в контроллере:
var name = HttpContext.User.Claims.FirstOrDefault(f => f.Type == ClaimTypes.NameIdentifier).Value;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы