ซึ่งเกิดจากการใช้ 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 ต่าง ๆ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น