<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های عباس عباس زاده - Abbas Abbaszadeh</title>
        <link>https://virgool.io/feed/@a.abbaszadeh</link>
        <description>همسر، پدر، توسعه دهنده نرم افزار، کارشناس بیمه های بازرگانی</description>
        <language>fa</language>
        <pubDate>2026-06-07 14:30:51</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/36242/avatar/nFjh3n.jpg?height=120&amp;width=120</url>
            <title>عباس عباس زاده - Abbas Abbaszadeh</title>
            <link>https://virgool.io/@a.abbaszadeh</link>
        </image>

                    <item>
                <title>استفاده از فایل های http. در ویژوال استودیو</title>
                <link>https://virgool.io/@a.abbaszadeh/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C-http-%D8%AF%D8%B1-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88-o1fefr7ldpy7</link>
                <description>شما API های خود را در دات نت چگونه تست می کنید؟ در پاسخ معمولا این عناوین رو می شنویم :PostmanSwaggerUnit testingاما اگر بدانید روش جدیدی نیز برای تست API های خودمان داریم چه؟!.NET 8 Web API with default .http fileبا استفاده از فایل http. می‌توانیم API‌های دات نت خود را تست کنیم، اگرچه این روش از مدت‌ها قبل موجود بود، اما اخیراً که یک API در NET 8 ایجاد کردم، متوجه آن شدم.این فایل به طور پیش فرض در دات نت 8 ایجاد می شود. چیزی شبیه به تصویر زیر :نمایی از محل قرارگیری فایل http.هدف این فایل چیست؟طبق مستندات مایکروسافت، ویرایشگر فایل http. راهی مناسب برای تست پروژه‌های ASP.NET Core، خصوصا APIها است.ویرایشگر یک رابط کاربری ارائه می دهد که:فایل های http را ایجاد و به روز می کند.درخواست های HTTP مشخص شده در فایل های http را ارسال می کند.پاسخ ها را نمایش می دهد.ظاهر این فایل چگونه است؟به طور پیش فرض این فایل حاوی کد های زیر است:محتوای پیش فرض فایل http.با استفاده از علامت ات ساین ( @ )  میتوانیم متغیر جدیدی را اضافه کنیم.سه هشتگ پست سر هم ( ### ) به عنوان جداکننده استفاده می‌شود تا به این فایل بگوییم که API قبلی در اینجا به پایان رسیده است و بعد از آن API دیگری داریم.چگونه می توانیم درخواست را ارسال کنیم؟پروژه خود را اجرا کنید و سپس روی Send request کلیک کنید و در سمت راست نتایج درخواست خود را مشاهده کنید.برای سایر متد های HTTP نیز میتوان از همین طریق، درخواست ها را اضافه کنیم.OPTIONSGETHEADPOSTPUTPATCHDELETETRACECONNECTچگونه header و body را اضافه کنیم؟می‌توانیم هدر را به صورت  key: value اضافه کنیم و برای اضافه کردن بدنه می توانیم از پرانتز های باز و بسته {} به شکل زیر استفاده کنیم.توصیه می کنم برای کسب اطلاعات بیشتر درباره نحوه تنظیم environment file ها، user secret ها و azure key vault مستندات مایکروسافت را بررسی کنید.ترجمه ای هرچند ناقص اما کار راه انداز با اندکی دخل و تصرف از :https://mwaseemzakir.substack.com/p/ep-49-use-http-files-in-visual-studio</description>
                <category>عباس عباس زاده - Abbas Abbaszadeh</category>
                <author>عباس عباس زاده - Abbas Abbaszadeh</author>
                <pubDate>Sat, 24 Feb 2024 14:48:39 +0330</pubDate>
            </item>
                    <item>
                <title>احراز هویت با JWT برای میکروسرویس ها در NET.</title>
                <link>https://virgool.io/@a.abbaszadeh/jwt-authentication-microservices-net-ti3nxzznxtwp</link>
                <description>همانطور که توسعه نرم افزار به معماری های Service-Oriented تکامل می یابد، چارچوب ها و روش های اساسی مورد استفاده نیز باید تغییر کنند. در این مقاله نحوه ایجاد سرویسی برای مدیریت احراز هویت در بین کامپوننت ها و سرورها را نشان می دهد.اخیراً، نرم‌افزار بیشتر به سمت سیستم‌های Component-Based، مانند SOA ( معماری سرویس‌گرا - Service-Oriented Architecture ) و به‌ویژه میکروسرویس‌ها متمایل شده است. در حالی که این رویکرد برای حل مسائل مقیاس پذیری و قابلیت استفاده مجدد در اکثر سیستم ها استفاده می شود، چند چالش جدید را نیز برای توسعه دهندگان ایجاد می کند.یکی از این چالش ها، تأیید هویت کاربر در multiple components است. در معماری SOA یا میکروسرویس، هر یک از Component ها ممکن است در یک سرور جداگانه مستقر شوند، بنابراین رویکرد یکپارچه ایجاد یک جلسه ( Session  ) برای هر کاربر دیگر کار نخواهد کرد. حتی اگر برنامه‌هایی که کاربر با آن‌ها تعامل دارد از یک Session برای اعتبارسنجی هویت کاربران استفاده کنند، این اعتبار در سایر Component ها معنایی ندارد.برای حل این مشکل باید یک فیلتر بین اپلیکیشن های فرانت اند و سرویس ها قرار داد. این فیلتر که API Gateway نامیده می شود به منظور هدایت هر درخواست به Component ای که مسئول رسیدگی به آن است، آن هم  تنها در صورتی که کاربر به انجام آن عمل خاص دسترسی داشته باشد، عمل می کند. و برای سبک نگه داشتن API Gateway، باید از یک Component خاص برای اعتبارسنجی هویت کاربران استفاده شود.یک جریان کاری معمولی برای چنین سیستمی به این صورت خواهد بود:1. کاربر از یک برنامه وب یا تلفن وارد می شود. اعتبارنامه ها ( Credentials ) از طریق API Gateway به Component مسئول ارسال می شوند.2. اگر اعتبارنامه ها درست باشد، یک توکن صادر می شود و به کاربر بازگردانده می شود.3. هر درخواست بعدی حاوی این توکن است که توسط API Gateway از طریق همان Component ای که آن را صادر کرده است تأیید می شود.اگر توکن معتبر باشد، درخواست مجاز به ارسال است.اگر توکن معتبر نباشد، درخواست مسدود می شود.در این مقاله بر ایجاد سرویسی که وظیفه صدور و تایید هویت کاربران را بر عهده دارد تمرکز خواهم کرد. من این را با ASP.NET Core WebAPI توسعه خواهم داد، اما این روش مستقل از زبان و ابزار بوده و میتوان آن را با تکنولوژی های دیگری نظیر Node.JS، Java یا Python با توجه به فضای و ابزار هایشان نیز پیاده کرد.توکن‌هایی که من استفاده خواهم کرد، از نوع JSON Web Tokens هستند (JWT، که «وسیله‌ای فشرده و ایمن برای نشان دادن ادعاها ( Claims ) برای انتقال بین دو طرف است.») اساساً، یک JWT یک شی JSON کدگذاری شده است با یک کلید مخفی ( Secret Key ) یا یک جفت کلید عمومی/خصوصی ( Public/Private Key ) امضا می‌شود.یک JWT از سه بخش مختلف تشکیل شده است: هدر ( Header )، محموله ( Payload  ) و امضا ( Signature ).قسمت Header معمولاً از دو بخش تشکیل شده است: نوع توکن (JWT) و الگوریتم هش مورد استفاده (مانند HMAC SHA256).قسمت Payload حاوی &quot;Claim&quot;های توکن است که بیانگر اظهاراتی در مورد یک موجودیت (به عنوان مثال کاربر) است. سه نوع Claim وجود دارد، ثبت شده ( Registered )، عمومی ( Public ) و خصوصی ( Private ). مهمترین آنها Claim ها خصوصی هستند که برای به اشتراک گذاشتن اطلاعات بین طرفینی که در مورد استفاده از JWT توافق کرده اند استفاده می شود. اینها می‌توانند شامل نام کاربر یا نقش‌ها ( Roles ) مانند مدیر یا ناشر باشند.پس از اینکه دو قسمت اول با استفاده از Base64Url کدگذاری شدند، امضا باید ایجاد شود. این شامل Header و Payload است که با استفاده از الگوریتم مشخص شده در هدر هش می شوند. هدف از امضا تأیید هویت فرستنده و اطمینان از عدم تغییر پیام است.در تصویر زیر، قسمت های گفته شده برای فهم آسان تر به ترتیب با سه رنگ مختلف جداسازی شده اند.نمونه ای از JWTایجاد سرویسهمانطور که گفتم پروژه در این مقاله با استفاده از ASP.NET Core WebAPI توسعه خواهد یافت. برای شروع، ویژوال استودیو را باز کنید و یک پروژه جدید ایجاد کنید. پروژه ای از نوع ASP.NET Core Web API را مطابق تصویر انتخاب کنید. از صفحه بعد من Net Core 5. را انتخاب کردم.اولین کاری که باید انجام دهید این است که یک کلاس User بسیار ساده ایجاد کنید که از Username و Password تشکیل شده است. من این کلاس را در پوشه جدید به نام Domain ساختم. از آنجایی که این آموزش فقط بر جنبه JWT تمرکز می کند، برای سادگی کار از پیاده سازی دسترسی به پایگاه داده یا هش رمز عبور صرف نظر میکنیم، بنابراین فقط آن را به صورت plain text ذخیره می کنم – بدیهی است که در پروژه های واقعی هرگز چنین کاری انجام نمی شود.public class User
{
    public string Username { get; set; }
    public string Password { get; set; }
}یکی دیگر از property هایی که می توانید به کاربر اضافه کنید یک نقش ( Role ) است. ساده ترین راه برای انجام این کار ایجاد یک enum به نام UserRole است، مانند این:public enum UserRole
{
    NORMAL,
    ADMIN
}فقط برای اینکه بتوانم با آن کار کنم، یک کلاس UserRepository در یک پوشه جدید به نام Repositories ایجاد می کنم که دسترسی به پایگاه داده را شبیه سازی می کند. این فقط شامل یک لیست است که من در Constructor پر می کنم، و Method ی که می تواند داده ها را از آن لیست بر اساس نام کاربری بازیابی کند.public class UserRepository
{
    public List&lt;User&gt; TestUsers;
    public UserRepository()
    {
        TestUsers = new List&lt;User&gt;();
        TestUsers.Add(new User() { Username = &amp;quotTest1&amp;quot, Password = &amp;quotPass1&amp;quot });
        TestUsers.Add(new User() { Username = &amp;quotTest2&amp;quot, Password = &amp;quotPass2&amp;quot });
    }
    public User GetUser(string username)
    {
        try
        {
            return TestUsers.First(user =&gt; user.Username.Equals(username));
        }
        catch
        {
            return null;
        }
    }
}اطمینان حاصل کنید که using مربوط به کلاس user را به UserRepository اضافه کرده باشید.برای شروع کار توکن واقعی، یک کلاس جدید در پوشه Services ایجاد می کنم که TokenService نام دارد. این کار هم از ایجاد و هم اعتبار سنجی توکن ها مراقبت می کند. برای استفاده از قابلیت JWT، باید بسته ای را نصب کنید که دسترسی به JWT را ارائه دهد. فقط روی پروژه در Solution Explorer کلیک راست کرده و Manage NuGet Packages را انتخاب کنید. مطمئن شوید که Browse انتخاب شده است. سپس JWT را در نوار جستجو جستجو کنید و بسته System.IdentityModel.Tokens.Jwt را نصب کنید. من نسخه ی 6.15.0 این پکیج را نصب کردم. System.IdentityModel.Tokens.Jwt 6.15.0اولین چیزی که در کلاس TokenService جدید ایجاد می شود، فیلدی به نام Secret است که قرار است به عنوان کلید مخفی توکن ها عمل کند. می توانید از یک Online Generator برای ایجاد یک Secret استفاده کنید یا می توانید با اجرای کد زیر در یک پروژه جداگانه و کپی کردن نتیجه ی کد، آن را در سی شارپ ایجاد کنید.HMACSHA256 hmac = new HMACSHA256();
string key = Convert.ToBase64String(hmac.Key);یا می توانید موردی را که من برای این کار استفاده می کنم کپی کنید:private static string Secret = &amp;quotXCAP05H6LoKvbRRa/QkqLNMI7cOHguaRyHzyg7n5qEkGjQmtBhz4SzYh4Fqwjyi3KJHlSXKPwVu2+bXr6CtpgQ==&amp;quotدر این کلاس، به using های زیر نیاز خواهید داشت:using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;اولین متدی که بخشی از کلاس TokenService خواهد بود متد GenerateToken است. نسخه من یک نام کاربری را به عنوان پارامتر انتخاب می کند، زیرا توکن ها قرار است هویت کاربران را تضمین کنند، اما شما می توانید هر پارامتر دیگری را که در مورد شما مناسب است را انتخاب کنید.public static string GenerateToken(string username)
{
    byte[] key = Convert.FromBase64String(Secret);
    SymmetricSecurityKey securityKey = new SymmetricSecurityKey(key);
    SecurityTokenDescriptor descriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, username) }),
        Expires = DateTime.UtcNow.AddMinutes(30),
        SigningCredentials = new SigningCredentials(
            securityKey,
            SecurityAlgorithms.HmacSha256Signature)
    };

    JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
    JwtSecurityToken token = handler.CreateJwtSecurityToken(descriptor);
    return handler.WriteToken(token);
}اولین کاری که این روش انجام می دهد ایجاد یک شی SymmetricSecurityKey با استفاده از Secret است  که قبلا با HMACSHA256 آن را ایجاد کرده بودیم. پس از آن، شروع به ایجاد SecurityTokenDescriptor می کنیم. این شی نشان دهنده محتوای اصلی JWT است، مانند claim ها، تاریخ انقضا و اطلاعات امضا. سپس، توکن ایجاد می شود و یک نسخه رشته ای از آن برگردانده می شود.در مثال، من فقط یک claim نام کاربری اضافه می کنم، اما لیست انواع claim هایی که می توان اضافه کرد بسیار زیاد است. همچنین می‌توانید پس از ایجاد توکن، با دسترسی به ویژگی Payload، داده‌های سفارشی را به آن اضافه کنید، مانند این:token.Payload[&amp;quotfavouriteFood&amp;quot] = &amp;quotcheese&amp;quotبرای جمع‌بندی این بخش از عملکرد، Controller و Action ی را ایجاد می‌کنیم که توکن‌ها را تولید می‌کند. روی پوشه Controllers در Solution Explorer کلیک راست کرده و Add -&gt; Controller را انتخاب کنید. ما به هیچ الگوی برای آن نیاز نداریم، بنابراین فقط کنترلر  API Controller - Empty را انتخاب کنید. من اسمش را LoginController گذاشتم. این Controller شامل دو Action است: یکی برای فرآیند ورود و دیگری برای فرآیند اعتبار سنجی. موارد زیر using های مورد استفاده در این کلاس هستند:using LoginService.Models;
using LoginService.Repositories;
using System.Net;
using System.Net.Http;
using System.Web.Http;در Action اول یک نام کاربری و یک رمز عبور گرفته شده، بررسی می کند که آیا آنها معتبر هستند و سپس یک توکن بر اساس نام کاربری ایجاد می کند.[HttpPost]
public HttpResponseMessage Login(User user)
{
    User u = new UserRepository().GetUser(user.Username);
    if (u == null)
        return Request.CreateResponse
                (HttpStatusCode.NotFound,&amp;quotThe user was not found.&amp;quot);
    bool credentials = u.Password.Equals(user.Password);
    if (!credentials) 
        return Request.CreateResponse(
             HttpStatusCode.Forbidden,
             &amp;quotThe username/password combination was wrong.&amp;quot);
    return Request.CreateResponse(
             HttpStatusCode.OK,
            TokenService.GenerateToken(user.Username));
}من این Action را به عنوان POST قرار دادم، بنابراین می‌توانم داده‌های شی را از طریق بدنه درخواست ( Request’s Body ) به جای پارامترهای URL ارسال کنم. از آنجایی که ما با رمزهای عبور سروکار داریم، بهتر است چنین اطلاعاتی را پنهان کنیم زیرا برای مثال پارامترهای URL در تاریخچه مرورگر ذخیره می شوند. من یک شی User را به عنوان پارامتر در نظر می‌گیرم، زیرا فقط نام کاربری و رمز عبور را در آن کلاس نگه می‌دارم. اگر شیء شما پیچیده‌تر است، پیشنهاد من این است که یک کلاس جداگانه ایجاد کنید که فقط حاوی داده‌هایی باشد که می‌خواهید ارسال شوند.در این Action، اولین کاری که من انجام می دهم بررسی وجود کاربر است. اگر تهی باشد، یک پاسخ NotFound (404) را برمی گردم. اگر کاربر واقعاً پیدا شد، در حال بررسی صحیح بودن رمز عبور هستم و اگر درست نیست، پیام مربوطه را برگردانم. در نهایت، اگر همه چیز خوب باشد، یک پیام OK را برمی گردانم که حاوی یک نشانه جدید بر اساس نام کاربری ارائه شده است.تست احراز هویتاکنون که نیمی از عملکرد به پایان رسیده است، ایده خوبی است که آن را در این مرحله آزمایش کنید. من قصد دارم از Postman برای این منظور استفاده کنم، اما جایگزین های زیادی وجود دارد که می توانید از آنها استفاده کنید، مانند Fiddler.پروژه را اجرا کنید، اما اگر پیغام خطای 403 ظاهر شد نگران نباشید. از آنجایی که به پوشه ریشه دسترسی دارید و هیچ منبعی در آن وجود ندارد، این طبیعی است. اما پروژه شما باید خوب اجرا شود. پس از اجرای آن، URL را از مرورگر در نرم افزاری که برای آزمایش استفاده می کنید کپی کنید. برای من به این شکل است : http://localhost:61225/  برای دسترسی به اکشنی که ایجاد شده است، /api/login/ را به URL اضافه کنید تا شبیه به نمونه ی زیر شود :http://localhost:61225/api/login/  خب حالا درخواست را به عنوان POST علامت گذاری کردم و محتوای درخواست را به عنوان داده JSON تنظیم کردم. در Postman این کار با انتخاب گزینه Raw در تب Body و سپس انتخاب گزینه JSON از منوی کشویی انجام می شود:سپس یک شی JSON متشکل از نام کاربری و رمز عبور در متن درخواست ایجاد کنید. فیلدهای شی JSON باید مانند Property های کلاس سی شارپ نامگذاری شوند تا بتوان آن را به درستی نگاشت ( Mapped ) کرد. این چیزی است که شی من به نظر می رسد:اکنون درخواست را ارسال کنید و بدنه پاسخ ( Response Body ) را بررسی کنید. باید شامل یک رشته باشد که از یک توکن جدید تشکیل شده است. این توکنی است که من دریافت کردم:اعتبار سنجی را اضافه کنیدبا کار تولید توکن، زمان شروع عملکرد اعتبار سنجی فرا رسیده است. به کلاس TokenService برمی گردیم و متدی به نام GetPrincipal ایجاد می کنیم، این متد می‌خواهد توکن را بخواند، اعتبارسنجی کند و یک شی ClaimsPrincipal ایجاد کند که هویت کاربر را نگه می‌دارد. public static ClaimsPrincipal GetPrincipal(string token)
{
    try
    {
        JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
        JwtSecurityToken jwtToken = (JwtSecurityToken)tokenHandler.ReadToken(token);
        if (jwtToken == null)
            return null;
        byte[] key = Convert.FromBase64String(Secret);
        TokenValidationParameters parameters = new TokenValidationParameters()
        {
            RequireExpirationTime = true,
            ValidateIssuer = false,
            ValidateAudience = false,
            IssuerSigningKey = new SymmetricSecurityKey(key)
        };
        SecurityToken securityToken;
        ClaimsPrincipal principal = tokenHandler.ValidateToken(
                                       token,
                                      parameters, 
                                      out securityToken);
        return principal;
    }
    catch (Exception e)
    {
        return null;
    }
}این method توکن را در قالب رشته می خواند و در صورت امکان آن را به JwtSecurityToken تبدیل می کند. پس از آن، لیستی از پارامترها ایجاد می شود که در طول فرآیند اعتبار سنجی استفاده می گردد و شامل ایجاد مجدد کلید، با استفاده از همان رمزی است که در طول تولید توکن وجود داشت. سپس شی ClaimsPrincipal ایجاد و برگردانده می شود. بلوک try-catch مواردی را که در آنها قالب توکن اشتباه است و نمی توان آن را تأیید کرد، رسیدگی می کند.اکنون method دیگری برای استخراج داده ها از شی Principal ایجاد کنید. این method جایی است که می‌خواهید بسته به اینکه چه داده‌هایی در توکن‌ها ارسال می‌کنید، چیزهایی را اضافه یا تغییر دهید.public static string ValidateToken(string token)
{
    string username = null;
    ClaimsPrincipal principal = GetPrincipal(token);
    if (principal == null)
        return null;
    ClaimsIdentity identity = null;
    try
    {
        identity = (ClaimsIdentity)principal.Identity;
    }
    catch (NullReferenceException)
    {
        return null;
    }
    Claim usernameClaim = identity.FindFirst(ClaimTypes.Name);
    username = usernameClaim.Value;
    return username;
}این متد شی Principal را با استفاده از توکن ایجاد می کند و سپس شی Identity را از آن استخراج می کند. این شی شامل تمام Claim های توکن، بر اساس Claim Type است.از آنجایی که توکن فقط شامل یک نام کاربری است، من روشی را برای برگرداندن آن نام کاربری طراحی کردم و هرگونه بررسی بیشتر در کنترلر انجام خواهد شد. برای مثال، اگر فیلدهای بیشتری در توکن دارید که نیاز به تأیید بیشتر از پایگاه داده خود دارند، می توانید این کار را در این method انجام دهید و آن را با یک Boolean برگردانید.خب، Action اعتبارسنجی توکن در همان login controller، از نوع GET است که نام کاربری و رمز را به عنوان ورودی می گیرد. می توانید کد آن را در پائین مشاهده کنید:[HttpGet]
public HttpResponseMessage Validate(string token, string username)
{
    bool exists = new UserRepository().GetUser(username) != null;
    if (!exists)
            return 
                Request.CreateResponse(
                    HttpStatusCode.NotFound,
                    &amp;quotThe user was not found.&amp;quot);
    string tokenUsername = TokenService.ValidateToken(token);
    if (username.Equals(tokenUsername))
        return Request.CreateResponse(HttpStatusCode.OK);
    return Request.CreateResponse(HttpStatusCode.BadRequest);
}در مرحله اول، وجود نام کاربری در Repository را بررسی می کند، زیرا هیچ دلیلی برای تأیید اعتبار یک توکن برای یک کاربر غیر موجود وجود ندارد. سپس توکن را با استفاده از method ایجاد شده قبلی تأیید می کند و یک پاسخ HTTP مناسب را برمی گرداند.تست اعتبار سنجیآخرین کار آزمایش این بخش از عملکرد کد است. یک بار دیگر دیباگ کردن را شروع کنید.از آنجایی که این یک درخواست GET است، من رمز و نام کاربری را به عنوان پارامترهای URL پر می کنم. روی دکمه Params در سمت راست URL کلیک کنید تا آنها را پر کنید.مثل اینکه مشکلی نیست و من پاسخ 200 را دریافت کردم.زمانی که نام کاربری یا توکن اشتباه باشد، پاسخ 400 دریافت می شود.سناریوهای دیگردر این مقاله، من فقط موردی را در نظر گرفتم که از یک سرویس خاص برای اهداف احراز هویت استفاده شود. با این حال، می‌توان از همین فناوری در سناریویی استفاده کرد که در آن توکن باید برای تأیید هویت کاربر برای دسترسی به همان Component استفاده شود. در آن صورت، راه‌حل ساده‌تر ایجاد یک filter احراز هویت و استفاده از آن برای action هایی است که نیاز به احراز هویت دارند. این سناریویی است که در آن Role Claim مفید خواهد بود، زیرا درخواست‌ها می‌توانند توسط سطوح مختلف مجوز فیلتر شوند. آموزش نحوه ایجاد فیلترهای احراز هویت در Web API را می توانید در اینجا بیابید.با تشکر از شما دوست عزیز بابت مطالعه ی این مقاله.در این ریپازیتوری بنده در گیتهاب هم نمونه ای از پیاده سازی و استفاده از JWT در میکروسرویس همراه با استفاده از Api Gatway رو میتونین مشاهده بفرمائید.ترجمه ای هرچند ناقص اما کار راه انداز با اندکی دخل و تصرف از :https://www.red-gate.com/simple-talk/development/dotnet-development/jwt-authentication-microservices-net/</description>
                <category>عباس عباس زاده - Abbas Abbaszadeh</category>
                <author>عباس عباس زاده - Abbas Abbaszadeh</author>
                <pubDate>Thu, 21 Jul 2022 17:33:08 +0430</pubDate>
            </item>
                    <item>
                <title>ویژوال استودیو را برای نامگذاری فیلدهای Private با Underscore پیکربندی کنید</title>
                <link>https://virgool.io/@a.abbaszadeh/configure-visual-studio-to-name-private-fields-with-underscore-lgshdw8m7lrm</link>
                <description>اکثر استانداردهای کدنویسی سی شارپ استفاده از camelCase را برای متغیرهای محلی و  camelCase_ را برای فیلدهای Private یا Internal توصیه می‌کنند. متأسفانه، Visual Studio فقط از camelCase برای این فیلدها استفاده می کند، که سناریوهای معمولی تزریق وابستگی را در سازنده ها آزاردهنده می کند :// ctor
public SomeClass(ISomeService someService)
{
    this.someService = someService; // annoying same name format usage
}که البته من این نسخه را ترجیح میدهم :// ctor
public SomeClass(ISomeService someService)
{
    _someService = someService; // obvious intent; no need for &#039;this&#039;
}خوشبختانه شما می توانید با انجام تغییراتی در Visual Studio، این ویژگی را در آن ایجاد کنید.در منو روی Tools کلیک کنید.بر روی Options کلیک کنید.بر روی Text Editor کلیک کنید.بر روی #C کلیک کنید.بر روی Code Style کلیک کنید.بر روی Naming کلیک کنید.بر روی Manage Naming styles کلیک کنید.اکنون شما باید پنجره ی  Manage naming styles را مشاهده کنید.در این قسمت، بر روی علامت + سبز رنگ که در گوشه ی پائین صفحه، سمت چپ قرار گرفته کلیک کنید.اکنون در پنجره ی Naming Style، اطلاعات خواسته شده را مطابق زیر وارد کنید.Naming Style: _fieldNameRequired Prefix: _Capitalization: camel Case Nameمطابق تصویر، اگر این مراحل را درست انجام داده باشید، Sample Identifier ، مقدار exampleIdentifier_ را نمایش خواهد داد.تقریبا به انتهای کار رسیده ایم! اکنون شما باید در قسمت زیر قرار گرفته باشید.بر روی علامت + سبز رنگ کلیک کنید و سپس در لیست های کشویی مقادیر زیر را ( مطابق تصویر بالا ) انتخاب کنید.Private or Internal Fields_fieldNameSuggestionحال در زمان refactoring یک پارامتر در Constractor برای ساخت متغیر و مقداردهی اولیه به آن، ویژوال استودیو آن را با استفاده از قانون نامگذاری fieldName_ نامگذاری می کند:با تشکر از شما دوست عزیز بابت مطالعه ی این یادداشت.ترجمه ای هرچند ناقص اما کار راه انداز از  : https://ardalis.com/configure-visual-studio-to-name-private-fields-with-underscore/</description>
                <category>عباس عباس زاده - Abbas Abbaszadeh</category>
                <author>عباس عباس زاده - Abbas Abbaszadeh</author>
                <pubDate>Fri, 17 Jun 2022 12:48:49 +0430</pubDate>
            </item>
                    <item>
                <title>فریلنسر عزیز! بیمه رو چه کردی؟! (2)</title>
                <link>https://virgool.io/Freeland/%D9%81%D8%B1%DB%8C%D9%84%D9%86%D8%B3%D8%B1-%D8%B9%D8%B2%DB%8C%D8%B2-%D8%A8%DB%8C%D9%85%D9%87-%D8%B1%D9%88-%DA%86%D9%87-%DA%A9%D8%B1%D8%AF%DB%8C-2-d9zr13fba4oq</link>
                <description>حادثه خبر نمیکنه فریلنسر جاندر یادداشت قبلی توضیح دادم که بیمه عمر و تامین آتیه یکی از بهترین گزینه های بیمه ای برای دوستان فریلنسر هست و همچنین در مورد پوشش های اصلی بیمه عمر و تامین آتیه صحبت کردم، در ادامه در رابطه با پوشش های اضافی میخوام توضیحاتی رو ارائه بدم.یکسری پوشش در بیمه نامه عمر و تامین آتیه وجود داره که اصطلاحا بهشون پوشش های اضافی یا تکمیلی میگن و شما در صورت تمایل میتونین اونا رو انتخاب کنین. فقط همونطور که در یادداشت قبل گفتم، با انتخاب این پوشش ها به نسبت ضرایب انتخابی شما، مقداری از سودی که در پایان قرارداد بهتون پرداخت میشه، کم خواهد شد.حالا این پوشش ها چیا هستن؟ به طور کلی میشه به سه قسمت اونارو تقسیم کرد:از کار افتادگی کامل و دائمحادثه ( فوت، نقص عضو و از کار افتادگی، هزینه پزشکی)بیماری های خاصاز کار افتادگی کامل و دائمعنوان کامل این پوشش معمولا تو بیمه های مختلف یکم متفاوته، ولی معمولا به این صورت بیان میشه : &quot;پوشش تکمیلی معافیت از پرداخت حق بیمه و پرداخت سرمایه بیمه از کار افتادگی به هر علت&quot;کار کرد این پوشش اینه که اگه به هر علت ( حادثه یا غیر حادثه) بیمه شده دچار از کارافتادگی کامل بشه و نتونه هیچ فعالیتی انجام بده ( به عبارت ساده تر خدای نکرده عین یه تیکه گوشت بشه یا دست و پاش یا دیگر اعضای بدنش طوری بشن که دیگه نتونه فعالیتی داشته باشه)، دیگه نیازی نیست حق بیمه رو  تا ادامه قرار داد پرداخت بکنه، انگاری خود شرکت بیمه جای بیمه گذار، حق بیمه رو به شرکت پرداخت میکنه!حالا یه گزینه ی دیگه هم اینجا شرکت های بیمه دارن مبنی بر اینکه اگه از کار افتادگی اتفاق افتاد، حداکثر به میزان 40 درصد سرمایه بیمه عمر به بیمه گذار نقدا پرداخت بشه.منظور از &quot;سرمایه بیمه عمر&quot; به زبان ساده اینه که اگه خدایی نکرده بیمه شده، فوت کنه، شرکت بیمه چه مقدار به ذینفعان فوت پرداخت میکنه. به اون مقدار پول، میگن &quot;سرمایه بیمه عمر&quot; یا &quot;سرمایه فوت عادی&quot;.حادثه ( فوت، نقص عضو و از کار افتادگی، هزینه پزشکی)به این پوشش هم میگن &quot;پوشش تکمیلی بیمه فوت، نقص عضو و از کار افتادگی جزئی، کلی و دائم و هزینه پزشکی بر اثر حادثه&quot;این یکی توضیحاتش خیلی زیاده، حوصلتون سر میره!فقط در این حد بگم اگه بر اثر حادثه ( تاکید میکنم، حادثه، نه بیماری) بیمه شده دچار فوت بشه علاوه بر اون سرمایه فوت عادی، یه پول اضافه تری حداکثر تا 3 برابر به ذینفعان فوت پرداخت میشه.حالا حادثه اتفاق افتاده، اما طرف فوت نکرده، ولی دچار نقص عضو شده یا حتی از کارافتاده شده، تو این حالت هم تا 3 برابر سرمایه فوت عادی به طرف پرداخت میشه.خیلی درگیر محاسبات نمیکنمتون اما این 3 برابری که تو دو مورد بالا گفتم یعنی اینکه مثلا شما در نظر بگیرین بیمه طرف طوریه که اگه الان خدای نکرده به صورت عادی بمیره، به ورثش 15.000.000 تومن پرداخت میشه.حالا اگه همین آدم بر اثر حادثه بمیره، علاوه بر این 15 میلیون، حداکثر تا 45.000.000 تومن به ورثه پرداخت میشه. همچنین حالا فوت نکرده ولی نقص عضو شده، در اینصورت حداکثر تا 45.000.000 بهش پرداخت میشه. فقط در نظر بگیرید که دید شرکت بیمه تو پوشش نقص عضو، دید غرامتی هست، یعنی کار نداره شما چقدر بیمارستان خرج کردی، چه 1 میلیون خرج کرده باشی، چه 100 میلیون خرج کرده باشی، شرکت میگه جدول سرمایه بیمه هرچی گفته حداکثر تا همونقدر پرداخت میشه، چون اساسا این پوشش قرار نیست هزینه پزشکی رو بده.اما پوشش بعدی وظیفش هزینه پزشکی بر اثر &quot;حادثه&quot; هست، یعنی حادثه اتفاق افتاده ولی طرف نه مرده، نه نقص عضو شده، ولی صدمه دیده و رفته بیمارستان معالجه کرده، خب اینجا فاکتورها رو میاره شرکت بیمه، حداکثر تا 10 درصد سرمایه فوت بهش پرداخت میشه. مثلا تو همون مثال قبلی، بر مبنای 15.000.000 تومن سرمایه فوت، حداکثر پوشش هزینه پزشکی حادثه میشه 1.500.000 تومن.فقط این وسط یه نکته بگم، حادثه چیه؟! بذارین دقیقا تعریف خود بیمه رو بگمحادثه عبارت است از هر واقعه ناگهانی از یک عامل خارجی که بدون قصد و اراده بیمه شده بروز کرده و منجر به جرح، نقص عضو، از کارافتادگی و یا فوت بیمه شده گردد.به عبارتی، شما فوتبال بازی کنی، پات بشکنه، از درخت بخوری زمین، ماشین بهت بزنه و ... اینا همش حادثه محسوب میشه. ( البته خدا نکنه واسه کسی اتفاق بیوفته)بیماری های خاصزیاد سرتون رو درد نیارم، این پوشش هم پوشش خوبیه، 5 تا بیماری از طرف بیمه مرکزی بهشون بیماری خاص گفته میشه که عبارتند از سرطان، سکته قلبی، سکته مغزی، جراحی عروق قلبی و پیوند اعضای اصلی بدن.خدایی نکرده اینا هر کدوم اتفاق بیوفته تا سقف 40.000.000 تومن ( با توجه به شرایط بیمه نامه ) به بیمه گذار پرداخت میشه. توجه داشته باشید تو این مورد هم دید شرکت، دید غرامتیه ، نه هزینه پزشکی.پوشش های دیگه ای هم هست که خیلی مهم نیست و شرکت به شرکت ممکن متفاوت باشه که سعی میکنم در یادداشت های بعدی خدمتتون عرض کنم.منتظر شنیدن نظراتتون هستم.</description>
                <category>عباس عباس زاده - Abbas Abbaszadeh</category>
                <author>عباس عباس زاده - Abbas Abbaszadeh</author>
                <pubDate>Wed, 24 Jul 2019 16:04:25 +0430</pubDate>
            </item>
                    <item>
                <title>فریلنسر عزیز! بیمه رو چه کردی؟! (1)</title>
                <link>https://virgool.io/Freeland/%D9%81%D8%B1%DB%8C%D9%84%D9%86%D8%B3%D8%B1-%D8%B9%D8%B2%DB%8C%D8%B2-%D8%A8%DB%8C%D9%85%D9%87-%D8%B1%D9%88-%DA%86%D9%87-%DA%A9%D8%B1%D8%AF%DB%8C-eo1liuc0ve8b</link>
                <description>عکس تزئینی است!شما هر کسب و کاری داشته باشی و یا بخوای تازه شروع کنی، یکی از چالش هات بیمه خواهد بود. اینکه اگه کارفرما باشی، خودت و کارگرانت رو بیمه بکنی؛ یا اگه کارمند یا کارگر باشی کارفرما بیمت بکنه. حالا این چالش زمانی که شما سبک شغلی فریلنسری رو انتخاب کرده باشی خیلی پررنگ تر میشه.بیمه (از منظر شغل) رو میشه در دو جهت بررسی کرد، اول اینکه این بیمه در خدمات درمانی و بیمارستانی چه کمکی به من میتونه بکنه، دوم هم اینکه در ایام پیری و بازنشستگی چه اندوخته و سرمایه ای برای من درنظر گرفته.تو این یادداشت من سعی میکنم بیمه رو از منظر دوم بررسی کنم و در یادداشت های بعدی هم موارد دیگه رو شرح بدم خدمتتون.خب وقتی صحبت از بیمه میشه همه به طور پیشفرض میرن سمت بیمه تامین اجتماعی. بیمه تامین اجتماعی مزایا و معایت خودش رو داره که الان تو این یادداشت نمیخوام در موردش خیلی توضیحی بدم و تو یه یادداشت دیگه قصد دارم بررسی خودم رو منتشر کنم.شما الان احتمالا هنوز در رده سنی جوانی قرار دارین و با نیروی جوانی با قدرت دارین کار میکنین و درآمد کسب میکنین، اما مساله ای که هست اینه که تا کی این قدرت در شما وجود داره؟ به فرض برنامه نویس بودن، شما تو 50 سالگی هم میخوای کد بزنی؟! 60 یا 70 سالگی چطور؟!اگه صادقانه بخوایم بگیم، واقعا چالش بزرگیه، بالاخره باید برای بازنشستگی، برنامه ریزی داشت و تو این مورد خیلی نباید تعلل کرد که تعلل مایه ی پشیمانی است! بهترین راه حلش میتونه این باشه که بخشی از درآمدتون رو برای ایام پیری و بازنشستگی پس انداز یا سرمایه گذاری کنید که میتونین از بانک و بورس و خرید سکه و طلا و ... استفاده کنین (کارهایی که خیلی تو کشور ما مرسومه).اما بهترین گزینه سرمایه گذاری، اونیه که هم از دید بازگشت سرمایه با سودش خوب باشه هم خدمات حاشیه ای و احیانا خدمات بیمه ای خوبی ارائه بده.خب بیمه ی عمر و تامین آتیه گزینه هست که این دو ویژگی رو با هم میتونه بهتون ارائه بده و بنظرمن یکی از بهترین انتخاب ها برای دوستان فریلنسر هست. بیمه عمر و تامین آتیه، یکی از محصولات بیمه ای شرکت های بیمه ای اعم از خصوصی و دولتیه. اجازه بدین دقیق تر براتون توضیح بدم. شما تو این بیمه انتخاب میکنین که چه مبلغی رو به چه مدتی و با چه روشی به شرکت بیمه پرداخت کنید. همچنین انتخاب میکنین بیمه با چه پوشش هایی و با چه ضرایبی براتون صادر بشه.هسته ی اصلی بیمه عمر و تامین آتیه، از دو قسمت جدا ناپذیر تشکیل شده که دقیقا تو اسمش اومده، منظورم اینه که این دوقسمتی که در ادامه میگم، اجباری هست و شما نمیتونین بگین من این موارد رو نمیخوام!مورد اول، پوشش عمرِ که با این پوشش اگر خدایی نکرده شما به هر دلیلی فوت کنید، یه مبلغی که از روز اول شرکت بیمه تو جدول &quot;ارزش بازخرید و سرمایه&quot; برای هر سال به طور جدا و کاملا شفاف مشخص کرده، تعهد کرده به ذینفعان فوت ( که خود شما در زمان صدور اونا رو مشخص کردید ) پرداخت میشه. خب بدیهی که با این پوشش آدم خیالش راحته که بعد فوتش خانوادش حداقل چندان دغدغه ی مالی نداشته باشن.پوشش بعدی هم بخش تامین آتیه ست، به این صورت که فرض کنید قرار داد 20 یا 30 ساله شما با شرکت تموم شده و شما همه ی حق بیمه ها رو هم پرداخت کردید؛ خیلی قدیما که فقط بیمه عمر به تنهایی بود، تو این مرحله پول شما سوخت شده بود و تمام! اما با اومدن قید &quot;تامین آتیه&quot; به این صورت شده که به زبان ساده مجموع پول پرداختی شما به شرکت تو اون 20 ، 30 سال به همراه سودش بهتون پرداخت میشه. نکته جالب اینه که معمولا سود این پول از سود بانکی بیشتره و اینکه بهش مالیات هم تعلق نمیگیره.خب این دوتا شد پوشش های اصلی. چندتا پوشش های انتخابی هم داریم که شما اگه دلت بخواد و با توجه به شرایط کاری و زندگی خودت میتونی انتخاب کنی که این پوشش ها برات فعال بشه یا نه. البته این رو هم باید بهش توجه کنی با انتخاب هریک از این پوشش ها، درصدی (هرچند به نظر بنده جزئی) از سودی که در پایان قرارداد میخوای بگیری کم میشه.بنظرم یادداشتمون خیلی طولانی شد و برای جلوگیری از حوصله سربر شدن، ادامه این یادداشت رو در پست  بعدی ادامه خواهم داد.لطفا نظراتتون رو هم با من به اشتراک بذارید و اگه سوال یا ابهامی بود، مطرح کنید، من در خدمتتون هستم.</description>
                <category>عباس عباس زاده - Abbas Abbaszadeh</category>
                <author>عباس عباس زاده - Abbas Abbaszadeh</author>
                <pubDate>Wed, 24 Jul 2019 09:53:27 +0430</pubDate>
            </item>
                    <item>
                <title>بازار مکاره سخنرانی</title>
                <link>https://virgool.io/@a.abbaszadeh/%D8%A8%D8%A7%D8%B2%D8%A7%D8%B1-%D9%85%DA%A9%D8%A7%D8%B1%D9%87-%D8%B3%D8%AE%D9%86%D8%B1%D8%A7%D9%86%DB%8C-uh6pbqgaio0m</link>
                <description>یکی از مشکلاتی که در جامعه خصوصا در رسانه های مختلف اینترنتی وجود داره، اظهار نظرهای غیر کارشناسی در زمنیه های مختلفه که از همین رو میتونه مردم رو به اشتباه بندازه که در نتیجش اعتماد عمومی مردم رو در مورد مسائل مختلف به طور کاذب بالا و یا پایین ببره.عکس تزئینی است!
بنده و شما در محیط خانواده، کار یا در بین دوستان نظرات خودمون رو بیان میکنیم اما باید این رو در نظر داشته باشیم که بدون داشتن اطلاعات، آمار و مطالعه‌ قبلی، فی‌البداهه در خصوص مسائل مختلف در حوزه های اقتصادی، اجتماعی، فرهنگی، سیاسی، بین‌المللی و ... نباید اظهارنظر کنیم. اما ارائه ی نظرات اونم با یک تریبون رسمی در یک محیطی شبیه به دانشگاه یا امثالهم برای عموم مردم، خیلی فرق داره.تاثیر این قبیل سخنرانی ها روی افکار عموم اتفاقا خیلی عمیق و ملموسه و غالبا هم پشت پرده ی این قبیل سخنرانی ها، مقاصد سیاسی یا تجاری مطرح هست.الان وضعیت به این صورت شده که هرکسی که توانایی به اختیار گرفتن تریبونی رو داره، این اجازه رو به خودش میده که تو حوزه هایی که تخصصی نداره و صرفا ادعای محقق بودن رو داره، وارد بشه و اظهار نظر بکنه.توجه داشته باشید این افراد، صرفا سخنران هستن، نه محقق و کارشناس؛ البته همشون ادعای محقق  و کارشناس بودن رو دارن.البته این افراد تخصص و تبحر خاصی در سفسطه و مغلطه دارن و این بر کسی پوشیده نیست.به قول آقای رضا امیرخانی، «به سخنران ها اعتماد نکنید. مشکل ما در جمهوری اسلامی این است که سخنران ها جای نویسنده ها و محقق ها را گرفته اند. حرف ها را برای شما خوشگل می کنند، راست و دروغ را در هم می آمیزند، با لحن بازی می کنند و شما فکر می کنید عجب حرفی زد!»کارشناس و محقق بودن هم ملاک هایی داره که این افراد تقریبا هیچکدوم این شاخص ها رو ندارن :1. تاليف يا ترجمه مقالات تخصصي و كتاب در زمينه های مربوطه2. دارا بودن تحصيلات دانشگاهي و يا تجربه مفيد و نسبتاً طولاني در زمينه‌هاي مربوطه3. صاحب نظر در حوزه‌ های مختلف از مسائل مربوط به سخنرانی4. توانايي تشخيص و تحليل معضلات مربوط به موضوعات سخنرانی و ريشه‌يابي آنها5. توانايي ارائه راه‌حل‌هاي مفيد و پايدار براي مشكلات 6. داشتن گواهينامه‌هاي تخصصي و مهارت مربوطهوقتی رزومه این افراد رو بررسی میکنی، متوجه میشی که سواد دانشگاهیشون که ارتباطی با موضوع سخنرانی نداره!اما میشه گفت خب! ایرادی نداره، شاید طرف رفته کلی وقت گذاشته، چند سال تحقیق کرده و به نوعی صاحب نظر شده تو این حوزه، اما بیشتر که به رزومش دقت میکنی، میبینی نه کتابی تو اون حوزه ی بخصوص نوشته و نه مقاله ای بدردبخوری که مثلا تو یه نشریه معتبر و علمی تو اون حوزه چاپ شده باشه.کل رزومه طرف اینه که سخنرانی در فلان جا، ورک شاپ در بیسار!!!!آقای مجیری در وبلاگش گفته «راه معروف شدن همین چیزهاست دیگر! سخنرانی کن و راست و دروغ را به هم بباف تا مردم به تو توجه کنند.»متاسفانه از نظر حقوقی هم مثل اینکه قانونی در منع سخنرانی و ارائه ی نظرات برای افراد غیرکارشناس وجود نداره و بنظرم نیازه که قانونی در این زمینه در مجلس تصویب بشه.</description>
                <category>عباس عباس زاده - Abbas Abbaszadeh</category>
                <author>عباس عباس زاده - Abbas Abbaszadeh</author>
                <pubDate>Fri, 07 Jun 2019 23:27:38 +0430</pubDate>
            </item>
            </channel>
</rss>