folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder Asp.Net Core Login - Cookie Olaylarinda Yardim



Asp.Net Core Login - Cookie Olaylarinda Yardim

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Selam arkadaslar

    Gönüllü yaptigimiz projede takildigim bir yer var. Aslinda bir sekilde hallettim ama bu yolun en uygun oldugunu düsünmüyorum, belki daha iyi bir yolu vardir.

    3. parti bir provider ile login yapiyorum. Sign-in with Google gibi bir secenek gibi.

    Login oluyorum, token, claims her sey tamam authorization istemeyen metodlardaki httpcontext altindaki identity bos oluyor, ancak metod'un üstünde authorize varsa o zaman context'ten erisebiliyorum.

    Benim amacim login olduktan sonra, metod ne olursa olsun context'ten erisebilmek.

    Üstte söyledigim gibi olayi cözdüm ama icime sinmedi bu sekil yapmak

        public async Task<IActionResult> IndexAsync()
        {
           var result = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
          HttpContext.User = result.Principal;
              
           return View();
        }

     

    bu sekil yaptigimda hem o metod icinde identity'e erisebiliyorum hem de cshtml sayfalarinda user nesnesi bos gelmiyor..

    Anladigim kadariyla bu context sürekli degisiyor o yüzden üstteki kodu her metod'da cagirmam gerekiyor ve o da cookie'den okuyor. Ama ben bu sekilde cagirmadan nasil erisebilirim, var midir bir yolur?

    isteyen arkadas uzaktan baglanip bakabilir.

    unbalanced tarafından 06/Şub/22 03:32 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MaviGozluDev
    MaviGozluDev's avatar
    Kayıt Tarihi: 05/Eylül/2005
    Erkek

    tam derdini anlamadım sanırım hocam da bi basecontroller'da gene cookiden okuma vs işlerini yapıp UserInfo gibi bişeye atsan sonra bu basecontroller'dan türeyen controllerlarda her yerde UserInfo olarak kullansan işini görmez mi?

     

    MaviGozluDev tarafından 06/Şub/22 11:57 tarihinde düzenlenmiştir

    .
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Cevap için teşekkürler. Önerin güzelmiş düşüneyim bunu.

    Sorun kısaca şu. Logini başarılı olmuş olsam da HttpContext altındaki İdentity.IsAuthorized, başında Authorize olmayan metodlarda false geliyor. Aynı zamanda hiç bir claim vs yok. Ama metod authorize attribute ile işaretlenmişse, claimse erişebiliyorum. Neden böyle oluyor?

    Yani neden farklı contextler oluşuyor. Sonuçta login oldum ve claims leri gördüm. Ama mesela Authorize gerekmeyen index metodunda context altında claims yok ve IsAuthenticated false. Aynı şekilde index.cshtml de User.Identity de boş olmuş oluyor. 

    Mesela ben bazı menü itemlerini IsAuthenticated true ise göster-gizli yapacağım ama User.Identity.IsAuthenticated false dönüyor.

    Eğer göstermek istediğim cshtml sayfasının metodu Authorize ile işaretlenmişse, o zaman bir sorun yok.

    Sorun sadece başında Authorize olmayan metodlarda oluyor.

    Örnek

    [Authorize]

    public IActionResult SecurePage{

    // User.Identity.IsAuthenticated true geliyor

    }

     

    public IActionResult NonSecurePage{

    //  User.Identity.IsAuthenticated false geliyor

    }

    Telden yazdığım için yazım yanlışları olabilir ama umarım anlaşılmıştır 

     

     


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    unbalanced bunu yazdı

    Cevap için teşekkürler. Önerin güzelmiş düşüneyim bunu.

    Sorun kısaca şu. Logini başarılı olmuş olsam da HttpContext altındaki İdentity.IsAuthorized, başında Authorize olmayan metodlarda false geliyor. Aynı zamanda hiç bir claim vs yok. Ama metod authorize attribute ile işaretlenmişse, claimse erişebiliyorum. Neden böyle oluyor?

    Yani neden farklı contextler oluşuyor. Sonuçta login oldum ve claims leri gördüm. Ama mesela Authorize gerekmeyen index metodunda context altında claims yok ve IsAuthenticated false. Aynı şekilde index.cshtml de User.Identity de boş olmuş oluyor. 

    Mesela ben bazı menü itemlerini IsAuthenticated true ise göster-gizli yapacağım ama User.Identity.IsAuthenticated false dönüyor.

    Eğer göstermek istediğim cshtml sayfasının metodu Authorize ile işaretlenmişse, o zaman bir sorun yok.

    Sorun sadece başında Authorize olmayan metodlarda oluyor.

    Örnek

    [Authorize]

    public IActionResult SecurePage{

    // User.Identity.IsAuthenticated true geliyor

    }

     

    public IActionResult NonSecurePage{

    //  User.Identity.IsAuthenticated false geliyor

    }

    Telden yazdığım için yazım yanlışları olabilir ama umarım anlaşılmıştır 

     

     

    Authorize attribute u yazılmış controllerde allowannonymous yazılmış action ı içinde durum aynı mı


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    DrKill bunu yazdı

    Authorize attribute u yazılmış controllerde allowannonymous yazılmış action ı içinde durum aynı mı

    Aynen hocam. Account controller classı o şekilde ve oradaki bir action tetiklenince user identity boş. Home controller'ında hiç bir attribute yok ama onda da aynı. Dolu geldiği yer sadece Authorize attribute olan metodlar.

     

    Acaba genel yapısı mı böyle yoksa benim kodumda mı sıkıntı var bilmiyorum

     

    unbalanced tarafından 06/Şub/22 14:18 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MaviGozluDev
    MaviGozluDev's avatar
    Kayıt Tarihi: 05/Eylül/2005
    Erkek
    unbalanced bunu yazdı
    DrKill bunu yazdı

    Authorize attribute u yazılmış controllerde allowannonymous yazılmış action ı içinde durum aynı mı

    Aynen hocam. Account controller classı o şekilde ve oradaki bir action tetiklenince user identity boş. Home controller'ında hiç bir attribute yok ama onda da aynı. Dolu geldiği yer sadece Authorize attribute olan metodlar.

     

    Acaba genel yapısı mı böyle yoksa benim kodumda mı sıkıntı var bilmiyorum

     

    Controller'ın tepesinde Authorize varken ActionMethod a [AllowAnonymous] eklediğinde olması lazımdı. 
    Account controller'ında yetkisiz erişim olmasını istediğin metodun başına alt alta önce [AllowAnonymous] sonra [Authorize] ekleyip denesene bi hocam :)

     

    MaviGozluDev tarafından 06/Şub/22 20:53 tarihinde düzenlenmiştir

    .
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    MaviGozluDev bunu yazdı
    unbalanced bunu yazdı
    DrKill bunu yazdı

    Authorize attribute u yazılmış controllerde allowannonymous yazılmış action ı içinde durum aynı mı

    Aynen hocam. Account controller classı o şekilde ve oradaki bir action tetiklenince user identity boş. Home controller'ında hiç bir attribute yok ama onda da aynı. Dolu geldiği yer sadece Authorize attribute olan metodlar.

     

    Acaba genel yapısı mı böyle yoksa benim kodumda mı sıkıntı var bilmiyorum

     

    Controller'ın tepesinde Authorize varken ActionMethod a [AllowAnonymous] eklediğinde olması lazımdı. 
    Account controller'ında yetkisiz erişim olmasını istediğin metodun başına alt alta önce [AllowAnonymous] sonra [Authorize] ekleyip denesene bi hocam :)

     

    iki dedigini de denedim hocam olmadi.. Farkli bir sorun var.Ve bence sorun bir sekilde cookie genel olarak kaydolmuyor, sadece AuthorizeType neyse o zaman cookie'den okuyor. 


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    unbalanced bunu yazdı
    MaviGozluDev bunu yazdı
    unbalanced bunu yazdı
    DrKill bunu yazdı

    Authorize attribute u yazılmış controllerde allowannonymous yazılmış action ı içinde durum aynı mı

    Aynen hocam. Account controller classı o şekilde ve oradaki bir action tetiklenince user identity boş. Home controller'ında hiç bir attribute yok ama onda da aynı. Dolu geldiği yer sadece Authorize attribute olan metodlar.

     

    Acaba genel yapısı mı böyle yoksa benim kodumda mı sıkıntı var bilmiyorum

     

    Controller'ın tepesinde Authorize varken ActionMethod a [AllowAnonymous] eklediğinde olması lazımdı. 
    Account controller'ında yetkisiz erişim olmasını istediğin metodun başına alt alta önce [AllowAnonymous] sonra [Authorize] ekleyip denesene bi hocam :)

     

    iki dedigini de denedim hocam olmadi.. Farkli bir sorun var.Ve bence sorun bir sekilde cookie genel olarak kaydolmuyor, sadece AuthorizeType neyse o zaman cookie'den okuyor. 

    Böyle bir sorunu internette de pek bulamadım. Ya basit bir hata var, ya implement edip override etmen gereken bir fonsiyon ya da startup ın poh yemesi

    Bulursa burayı doldur

    DrKill tarafından 07/Şub/22 00:04 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    camarade
    ontedi
    ontedi's avatar
    Kayıt Tarihi: 04/Eylül/2005
    Erkek

    ActionFilter tanımlayıp onun üzerinden erişim kontrolü yapsan?

    Anladığım kadarıyla her controller içinden cookiye erişimek istiyorsun.


    Matematikçi ve Yazılımcı. http://www.ontedi.com ve http://www.cizgi.site Siteme beklerim herkesi.
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    @DrKill hocam istersen baglanip bakabilirsin yani hatayi bulabilirim diyorsan makine seni bekliyor :)

    @ontedi en basit haliyle cözmek istiyorum aslinda hocam. Daha önce actionfilter kullanmadim ama sanirim middleware gibi calisiyor. Aslinda cookie vs ile isim yok ama bu login bilgisi cookie'de tutuluyor. 

    Benim anlamadigim notka su, neden bu kadar karisik. Yani authentication yaptiktan sonra login menü item'ini gizlemem lazim ama girdigim sayfaya göre (action), context'de user identity var veya yok.. Yani ben mi yanlis yapiyorum acaba yoksa bu böyle mi calisiyor. Cookie olusuyorsa zaten bunu neden her yerde kullanamiyorum onu anlamis degilim. 

    var result = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    HttpContext.User = result.Principal;

    su kod isimi görüyor ama her metoda bunu yazmak istemiyorum. ActionFitler de sart degilse onu da yapmak istemiyorum ben direk HttpContext.User.Identity üzerinden ulasmak istiyorum (yukaridaki kodu yazmadan).


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Hannibal_King
    Hannibal_King's avatar
    Kayıt Tarihi: 22/Ağustos/2010
    Erkek

    Web uygulaması geliştirmemizi sağlayan bir frameworkten beklediğimiz en önemli şey; HTTP isteklerini nesneler ile temsil etmesidir.  Ve biz bu nesnelere uygulama kodlarımız aracılığı ile erişebilmeliyiz. Bir HTTP isteği düz bir metin olabilir veya binary formda da olabilir. HTTP 1.1, 2.0 farketmez. Framework bu isteği alır parçalar ve C# tarafında belirli nesnelere yerleştirir. Ve hatta client a dönülecek olan HTTP isteğini de kolayca manipüle edebilelim diye onun içinde ayrı bir nesne oluşturur. Ve bizde yazılımcı olarak bu nesneler ile muhatap oluruz. Bütün bu işleme HTTP isteğini handle etmek(ele almak) diyebiliriz. Yani framework un ele alması.

    İşte ASP.NET Core da bu işi HttpContext nesneleri ile çok güzel bir şekilde yapıyor. Biz HttpContext nesneleri sayesinde querystringlere, cookielere, ip adresine, routing bilgilerine kısaca HTTP mesajında ne varsa ona erişebiliyoruz. HttpContext nesnesinin request e özgü olduğunu unutmayalım. Her gelen istek için ayrı bir nesne gibi düşünebiliriz. 

    Uygulamanın farklı yerlerinden HttpContext nesnesine erişebilmek mümkün. Bazen bir viewdan, bazen controller içinden, bazen filters içinden, bazen bir middleware içinden HttpContext e erişmek isteyebiliriz. HttpContext nesnesine erişmemizi sağlayacak olan propertylerin veya değişkenlerin isimleri farklı olabilir. Örneğin View üzerinde HttpContext e erişmek istersek @ViewContext.HttpContext yazmamız gerekebilir. (property isimleri ASP.NET ve ASP.NET Core da değişkenlik gösterebiliyor.) Ancak yazılımcının temel amacı hep aynı: HttpContext e eriş ve gerekliyse manipüle et veya bir değeri oku.

    Senin örneğe gelecek olursak;

    *) Önce doğrudan problemi çözelim. 

    Herkesin erişebildiği bir action methodun ve bu action methodun çalışması sonucunda ortaya çıkan bir View var. Sen bu view üzerindeki bir alanı yani HTML kodunu duruma göre gizlemek veya göstermek istiyorsun.

    1-) Projende Util isminde bir klasör aç. İçine MyBasePage isimli bir sınıf ekle. Bu sınıfı RazorPage sınıfından türet. (GÖRSEL 1) Bu sınıflar generic olacak.

    https://bulutdoktor.notion.site/tbt-photo-9f98e1a436a64e51a509556ee4d78e7e  tüm görsellere bu link üzerinden erişebilirsin.

    2-) Bu sınıfın içine bir metot yaz ismine IsAuthenticated() diyebilirsin. GÖRSEL 2 de olduğu gibi içini kendince yaz. Sen burada auth-cookie olup olmadığına bakacaksın. Artık cookienin adı ne ise cookie varsa metodun true yoksa false dönecek.

    Dikkat edersen RazorPage isimli sınıftan dahi HttpContext nesnesine erişebiliyoruz.

    3-) GÖRSEL 3 te koyduğum gibi Views klasörünün altına doğrudan _ViewImports.cshtml isimli dosyayı oluştur.

    4-) GÖRSEL 4 te olduğu gibi _ViewImports.cshtml içinde senin viewlarının 1.adımda oluşturduğun MyBasePage sınıfını dikkate alacaklarını söyle. Böylece MyBasePage sınıfındaki metotları tüm viewlarından kullanabileceksin.

    5-) İstediğin view a git @if (IsAuthenticated()){ // HTML KODLARIN } yaz.

    ideal çözüm bu.

    *) Controller içinden o anki Request in sahibi olan User ın bilgilerine erişmek istersek ne yapacağız?

    @MaviGozluDevün dediği gibi yapacağız. MyBaseController isimli bir controller oluşturup diğer tüm Controllerları MyBaseController dan türeteceğiz. MyBaseController içinde CurrentUser isimli bir property olabilir.

    GÖRSEL 5 te kendi örneğimi attım. Burada rahat bir şekilde CurrentUser = context.HttpContext.Items["CurrentUser"] as OnlineUserData; yazmışım ben. Çünkü HttpContext.Items ın içine daha önceden Anahtarı "CurrentUser" olan ve değeride OnlineUserData türünden bir nesne olan itemi koymuşum. HttpContext.Items son derece önemlidir. Tüm pipeline boyunca veri taşımamızı sağlar. 

    Ben Controller'ın OnActionExecuting metodundan daha önce hazırladığım bu item'e erişiyorsam bunu nerede SET etmiş olabilirim. Mantıken Controller çalışmadan önce set etmem lazım. Evet öylede yaptım.

    Kendim bir filtre yazdım. GÖRSEL 6 ya bakabilirsin. 

    *) Peki filtreler her zaman Controllerdan önce mi çalışır?

    HAYIR. Hangi filtre olduğuna bağlı. Ben kendi örneğimde IAuthorizationFilter kullanmışım. Çünkü biliyorum ki bu filtre Controller dan önce çalışacak.

    *) Filtre ne demek?

    ASP.NET Core ve ASP.NET te bulunan özelleştirilmiş Attributelardır. Bizim gelen requeste belirli noktalarda müdahale etmemizi sağlar.

    *) Filtre kavramı middleware kavramı gibi mi?

    Hayır. Detaya girmiyim uzun sürer.

     

    Authorize attribute kullanmayınca HttpContext.User boş geliyorsa demekki ilgili attribute o property yi dolduruyor. Normal bir durum. Pipeline, Filters vb. konular üzerine uzun uzun yazardım ama konu uzamasın çok. Umarım faydalı olur.

Toplam Hit: 2878 Toplam Mesaj: 18
login with google asp.net core authentication