none
Net Core 3.1 Api ve Web Kimlik Doğrulama RRS feed

  • Soru

  • Merhaba,

    Net Core 3.1 ile Razor web projesinde
    hem microsoftun default authenticationı hem JWT Bearer token aynı kullanıcı veritabanını kullanarak birlikte çalışabilir mi?

    Token üretmeye kadar çalıştırabiliyorum ama api'den [authorization] ile data çekmek istediğimde direk login sayfasına atıyor ya da tam tersi api kısmı çalışıyor ama normal kullanıcı girişini kabul etmiyor.


    pgnchess.com

    dergikapaklari.com

    21 Şubat 2020 Cuma 04:07

Yanıtlar

  • Ben onu şu şekilde yapmıştım. LoginManager yapısı kurdum. LoginModelime typeId diye bir alan tanımladım. Web sitesinden geliyorsa typeId 1 apiden geliyorsa 0 yapıyordum. 0 dan geleni JWT token aldırıyordum 1 den geleni normal login yaptırıyordum. Örnek kodum aşağıdaki gibiydi 

            public async Task<ApplicationUser> UserLogin(LoginViewModel2 model)
            {
    
                var user = this.Find(x => x.Email == model.email);
    
                if (user == null)
                {
                    return null;
                }
    
                try
                {
                    var kullanici = await _userManager.CheckPasswordAsync(user, model.password);
                    if (kullanici)
                    {
                        user.Browser = model.Object.Request.Headers["User-Agent"].ToString();
                        user.LastIpAdress = model.Object.Request.HttpContext.Connection.RemoteIpAddress.ToString();
                        user.LastLoginDate = DateTime.Now;
                        Update(user);
    
    
                        var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, ClaimTypes.Name, ClaimTypes.Role);
    
                        identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserName));
                        identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
                        identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));
                        foreach (var role in _userManager.GetRolesAsync(user).Result)
                        {
                            identity.AddClaim(new Claim(ClaimTypes.Role, role));
                        }
                        ClaimsPrincipal principal = new ClaimsPrincipal(identity);
    
                        var tokenHandler = new JwtSecurityTokenHandler();
                        var key = Encoding.ASCII.GetBytes("YVBy0Or7gHuw1qvUC5dcGt3SBM=");
                        var tokenDescriptor = new SecurityTokenDescriptor
                        {
                            Subject = identity,
                            Expires = DateTime.UtcNow.AddDays(7),
                            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
                        };
                        var token = tokenHandler.CreateToken(tokenDescriptor);
                        user.Token = tokenHandler.WriteToken(token);
                        if (model.Type == 1)
                        {
                            await Current.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties { IsPersistent = true });
                            Current.Session.SetObject("Users", user);
                        }
    
                        return user;
                    }
                    else
                    {
                        return null;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
    
            }

    Buda Model. Tabi benim modelde kullanıcın IP adresini vs almak için HttpContext nesnesini kullandım sen istersen kullanma 

       public class LoginViewModel2
        {
            [Required]
            public string email { get; set; }
    
            [Required]
            public string password { get; set; }
    
            public HttpContext Object { get; set; }
            public int Type { get; set; } = 0;
            public bool RememberMe { get; set; }
        }


    22 Şubat 2020 Cumartesi 13:37