วันพุธที่ 12 กันยายน พ.ศ. 2561

ปัญหาไม่สามารถใช้คำสั่ง User.IsInRole ใน .Net Core 2.1 ได้

เป็นปัญหาจากการ Design ของ .Net Core เอง ดูได้จาก คู่มือของ Microsoft ดังนี้
ซึ่งเกิดจากการใช้ AddDefaultIdentity ใน ASP.NET Core 2.1 แต่ ฟังก์ชั่นนี่จะได้รับการแก้ไขใน ASP.NET Core 2.2 ซึ่่งขณะนี้ยังเป็นสถานะ preview อยู่

แต่ก็มี work around โดยการกลับมาใช้ function เดิม คือ การกลับมาใช้ services.AddIdentity<ApplicationUser, IdentityRole>() แบบเดิม
ดังภาพ
แต่การกลับมาทำแบบนี้ จะทำให้มีปัญหาเกิดขึ้นอีกอย่าง คือ การ redirect และ การส่งอีเมล์จากฟังก์ชั่นยืนยันตนสองขั้นตอน จาก function ของ AddDefaultIdentity  เนื่องจากหายไป เพราะการใช้ AddIdentity

ทำให้ต้องมีการ config เพิ่มในสองส่วนนี้  (สาม ถ้าต้องส่ง SMS ด้วย)

อย่างแรก แก้ปัญหาการ redirect ผิดหน้า เนื่องจาก AddIdentity เดิม จะอ้าง Controller เดิม ซึ่งไม่มี Area ทำให้หาไม่พบ เนื่องจาก .Net Core 2.1 ได้มีการเพิ่ม Area สำหรับ Function Identity เพิ่มเข้ามาแทน

ตัวอย่างเช่น Function ConfigureServices ใน StartUp.cs


เราจะใช้ Function services.ConfigureApplicationCookie ในการดำเนินการ ดังตัวอย่าง
    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

เท่านี้ การ Redirect เมื่อยังไม่เข้าระบบหรือถูกปฏิเสธิสิทธิ์การเข้าถึงก็จะใช้งานได้ ต่อไป การจัดการเกี่ยวกับการส่งอีเมล เนื่องจาก ถ้าคลิกเข้าหน้า Manage หรือ หน้าที่มีการ injection IEmailSender จะ Error เนื่องจากไม่ได้ตั้งค่าไว้ ก็ให้สร้าง class ใหม่ สืบทอดจาก IEmailSender

 public class EmailSender : IEmailSender
    {
        public EmailSender()
        {
        }

        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Execute("", subject, message, email);
        }

        public Task Execute(string apiKey, string subject, string message, string email)
        {
            SmtpClient client = new SmtpClient("mysmtpserver");
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("username", "password");

            MailMessage mailMessage = new MailMessage();
            mailMessage.From = new MailAddress("whoever@me.com");
            mailMessage.To.Add("receiver@me.com");
            mailMessage.Body = "body";
            mailMessage.Subject = "subject";
            return client.SendMailAsync(mailMessage);
        }
    }

แล้วก็ไปเพิ่ม option ในส่วนของ services ว่า

services.AddTransient<IEmailSender, EmailSender>();

ก่อนเรียก mvc  จะได้ประมาณนี้ครับ


เท่านี้ ก็น่าจะใช้ได้แล้ว สำหรับการใช้ User.IsInRole หรือการจัดการ Role ใน Controller ต่าง ๆ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น