یک نکته‌ی تکمیلی: ارتقاء به نگارش 9
- در نگارش 9، خاصیت context.Instance در کلاس LowerThanValidator، به context.InstanceToValidate تغییر نام یافته‌است.
- همچنین در کلاس LowerThanClientValidator، متد GetErrorMessage به صورت زیر تغییر می‌کند:
        private string GetErrorMessage(ClientModelValidationContext context)
        {
            var configuration = ValidatorOptions.Global;
            var formatter = configuration.MessageFormatterFactory().AppendPropertyName(Rule.GetDisplayName());
            string messageTemplate;
            try
            {
                messageTemplate = Validator.Options.ErrorMessageSource.GetString(null);
            }
            catch (FluentValidationMessageFormatException)
            {
                messageTemplate = configuration.LanguageManager.GetStringForValidator<NotEmptyValidator>();
            }
            return formatter.BuildMessage(messageTemplate);
        }
اعتبارسنجی، یک «cross-cutting concern» هست و نباید با «business logic» مخلوط شود. برای مدیریت «cross-cutting concern»ها عموما از روش‌های AOP استفاده می‌شود؛ مانند قرار دادن یک Attribute بر روی متدی که قرار است پیش از اجرای منطق اصلی این متد، اجرا شود (الگوی decorator). در اینجا هم اجرای اعتبارسنجی‌ها دقیقا به همین صورت است. پیش از رسیدن به متدهای سرویس برنامه، به صورت خودکار، کار اجرای اعتبارسنجی آن‌ها انجام می‌شود.
یک نمونه‌ی از جداسازی‌های «cross-cutting concern»‌ها در مطلب «Validating with a Service Layer» خود مایکروسافت قابل مشاهده‌است. ابتدا با قرار دادن کل منطق اعتبارسنجی در داخل یک سرویس شروع کرده و سپس این منطق را refactor کرده و تبدیل به یک سرویس مجزای قابل استفاده‌ی در یک سرویس و یا کنترلر در آورده. البته آن مطلب عمومی است و هر دوی این‌ها با Fluent validation، چه به صورت اعمال خودکار و یا اجرای دستی، قابل انجام است.
در کل پیاده سازی اعتبارسنجی business logic، توسط specification pattern انجام می‌شود؛ دقیقا مانند تعاریف AbstractValidatorها در Fluent validation (که پیاده سازی specification pattern هستند) و عموما اجرای آن‌ها به دلیل cross-cutting concern بودن، توسط decorator pattern صورت می‌گیرد؛ مانند روش‌های سوم و چهارم اجرای AbstractValidatorها.
‫۴ سال و ۲ ماه قبل، سه‌شنبه ۱۰ تیر ۱۳۹۹، ساعت ۰۳:۱۹
- در اولین تصویر این مطلب، بررسی کنید چه نوع HTTPS binding ای تعریف شده و جزئیات آن چیست؟
+ این تنظیم را شاید تغییر دادید (همان حالت ignore درست هست):

website -> SSL Settings -> Client Certificates -> Select `Ignore`:  This is the default option.
یک نکته‌ی تکمیلی: متوقف کردن اعتبارسنجی‌ها با اولین مشکل رخ‌داده

اگر نمی‌خواهید تمام شرط‌های تعریف شده در صورت شکست یکی از آن‌ها با هم اجرا شوند، می‌توان از خاصیت CascadeMode اعتبارسنج تعریف شده با مقدار StopOnFirstFailure استفاده کرد:
namespace FluentValidationSample.ModelsValidations
{
    public class ApiSettingsValidator : AbstractValidator<ApiSettings>
    {
        public ApiSettingsValidator()
        {
            this.CascadeMode = CascadeMode.StopOnFirstFailure;
حالت پیش‌فرض آن Continue است و تمام شرط‌های تعریف شده را اجرا می‌کند. حالت StopOnFirstFailure خصوصا برای زمانیکه بررسی بعضی از شرط‌ها سنگین‌تر هستند، مفید است.

روش دیگر انجام اینکار، صدور استثنائی در صورت شکست اعتبارسنجی خاصی است:
RuleFor(m => m.ServiceEndpoints)  
    .Must(s => s.GroupBy(s => s.Name).Count() == s.Count())  
    .OnFailure(_ => throw new ValidationException("names must be unique"));
البته CascadeMode را به یک تک اعتبارسنج هم می‌توان اعمال کرد تا مثلا اگر NotNull با شکست مواجه شد، مابقی موارد بررسی نشوند:
RuleFor(x => x.Surname)
   .Cascade(CascadeMode.StopOnFirstFailure)
   .NotNull()
   .NotEqual("foo");
- همان مسیری را که عنوان کرده (https://localhost:6001/.well-known/openid-configuration) در مرورگر باز کنید؛ باید قابل دسترسی باشد.
- اگر قابل دسترسی بود، بیشتر مشکل HTTPS هست. برای این منظور، حتما نیاز هست با قسمت «تنظیم مجوز امضای توکن‌های IDP» آشنا باشید و آن‌را پیاده سازی کرده باشید (مهم و اجباری!)
- غیرفعال کردن بررسی مجوز در Xamarin این نکات را هم به همراه دارد:
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var options = new OidcClientOptions(); 
options.BackchannelHandler = new HttpClientHandler
{ 
  ServerCertificateCustomValidationCallback = (message, certificate, chain, sslPolicyErrors) => true
};