ตัวอย่างนี้ใช้บริการ. NET App Security & Web API ฟรีของเราเพื่อใช้การรับรองความถูกต้องและการเข้าถึงข้อมูลตามบทบาท เราใช้ตัวช่วยสร้างในตัวเพื่อสร้างบริการตรวจสอบความถูกต้องพร้อมใช้งาน บริการนี้ใช้ Entity Framework Core เพื่อเข้าถึงฐานข้อมูล แอปพลิเคชัน. NET MAUI ส่งคำขอไปยังบริการ Web API เพื่อรับหรือแก้ไขข้อมูล

หากคุณยังใหม่กับบริการ DevExpress .NET App Security & Web API คุณอาจต้องการตรวจสอบทรัพยากรต่อไปนี้:
สร้างแอปพลิเคชัน Web API แบบสแตนด์อโลน
โซลูชัน 1 คลิกสำหรับ CRUD Web API พร้อมการควบคุมการเข้าถึงตามบทบาทผ่าน EF Core & ASP.NET
SQL Server หากคุณเรียกใช้โซลูชันนี้บน Windows
เรียกใช้ Visual Studio ในฐานะผู้ดูแลระบบและเปิดโซลูชัน สิทธิ์ของผู้ดูแลระบบอนุญาตให้ IDE สร้างฐานข้อมูลเมื่อคุณเรียกใช้โครงการบริการเว็บ
เลือก WebAPI ในเมนูแบบเลื่อนลง ของดีบัก ตัวเลือกนี้ช่วยให้ Kestrel เป็นเว็บเซิร์ฟเวอร์สำหรับการดีบักทำงาน

หากคุณต้องการ IIS Express ถึง Kestrel ให้เลือก IIS Express ในเมนูแบบเลื่อนลง ของดีบัก ใช้ตัวแก้ไขข้อความภายนอกเพื่อเพิ่มรหัสต่อไปนี้ .vsMAUI_WebAPIconfigapplicationhost.config
< sites >
< site name = " WebSite1 " id = " 1 " serverAutoStart = " true " >
<!-* ... -->
< bindings >
< binding protocol = " http " bindingInformation = " *:65201:* " />
< binding protocol = " https " bindingInformation = " *:44317:* " />
< binding protocol = " https " bindingInformation = " *:44317:localhost " />
< binding protocol = " http " bindingInformation = " *:65201:localhost " />
</ bindings >
</ site >
<!-* ... -->
</ sites > คลิกขวาที่โครงการ MAUI เลือกตั้ง Set as Startup Project และเลือก Emulator ของคุณ โปรดทราบว่าอุปกรณ์ทางกายภาพที่แนบมากับ USB ไม่สามารถเข้าถึงเครื่องในท้องถิ่นของเครื่องของคุณได้
คลิกขวาที่โครงการ WebAPI และเลือก Debug > Start new instance
คลิกขวาที่โครงการ MAUI และเลือก Debug > Start new instance
บริการ DeVexpress Web API ใช้ JSON Web Tokens (JWT) เพื่ออนุมัติผู้ใช้ หากต้องการรับโทเค็นให้ส่งชื่อผู้ใช้และรหัสผ่านไปยังจุดสิ้นสุด ของการรับรองความถูกต้อง ในตัวอย่างนี้ตรรกะการสร้างโทเค็นถูกนำไปใช้ใน WebAPIService.RequestTokenAsync วิธีการ:
private async Task < HttpResponseMessage > RequestTokenAsync ( string userName , string password ) {
return await HttpClient . PostAsync ( $ " { ApiUrl } Authentication/Authenticate" ,
new StringContent ( JsonSerializer . Serialize ( new { userName , password = $ " { password } " } ) , Encoding . UTF8 ,
ApplicationJson ) ) ;
}รวมโทเค็นใน httpclient.defaultrequestheaders.authorization คำขอที่ตามมาทั้งหมดสามารถเข้าถึงจุดสิ้นสุดและข้อมูลส่วนตัว:
HttpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , await tokenResponse . Content . ReadAsStringAsync ( ) ) ;ไฟล์เพื่อดู: webapiservice.cs
เราใช้จุดสิ้นสุดที่กำหนดเองต่อไปนี้ในบริการ WebApi :
จุดสิ้นสุด CandeletePost ช่วยให้คุณสามารถส่งคำขอจากอุปกรณ์มือถือไปยังบริการและตรวจสอบว่าผู้ใช้ปัจจุบันสามารถลบโพสต์ได้หรือไม่ สิ่งนี้ช่วยให้คุณสามารถแสดง/ซ่อนปุ่มลบใน UI
ไฟล์เพื่อดู: updater.cs
จุดสิ้นสุด ของ CurrentUser ส่งคืนข้อมูลเกี่ยวกับผู้ใช้ที่ได้รับการรับรองความถูกต้อง
ไฟล์เพื่อดู: updater.cs
จุดสิ้นสุดของ GetAuthorimage ดึงภาพผู้เขียนด้วยรหัสผู้ใช้
ไฟล์เพื่อดู: updater.cs
จุดสิ้นสุดของ getPostimage ดึงภาพตามรหัสโพสต์
ไฟล์เพื่อดู: updater.cs
เมธอด Updater.UpdateDatabaseAfterUpdateSchema สร้างผู้ใช้และระบุข้อมูลรับรองการเข้าสู่ระบบ คุณสามารถแก้ไขรหัสผ่านของผู้ใช้โดยตรงในฐานข้อมูล หมายเหตุ: Framework แอปพลิเคชันข้ามแพลตฟอร์มของเรา (XAF UI) ช่วยให้คุณสามารถสร้างเดสก์ท็อปหรือเว็บ UI ที่เข้าถึงฐานข้อมูลเดียวกันได้อย่างรวดเร็ว
ไฟล์เพื่อดู: updater.cs
PermissionPolicyRole Objects ในคลาส Updater เพิ่มสิทธิ์ผู้ใช้ โค้ดตัวอย่างต่อไปนี้เรียกใช้เมธอด AddObjectPermissionFromLambda เพื่อกำหนดค่าบทบาท "viewer" (อนุญาตให้ผู้ใช้อ่านโพสต์ที่เผยแพร่):
role . AddObjectPermissionFromLambda ( SecurityOperations . Read , p => p . IsPublished , SecurityPermissionState . Allow ) ;ไฟล์เพื่อดู: updater.cs
วิธีการ AddTypePermissionsRecursively จะปรับเปลี่ยนสิทธิพิเศษสำหรับบทบาท "Editor" (Alex, Antony และ Dennis) วิธีการเพิ่มสิทธิ์ CRUD (สร้าง, อ่าน, อัปเดต, ลบ) สำหรับประเภท Post :
role . AddTypePermissionsRecursively < Post > ( SecurityOperations . Read | SecurityOperations . Write | SecurityOperations . Create | SecurityOperations . DeleteObject , SecurityPermissionState . Allow ) ;ไฟล์เพื่อดู: updater.cs
ใช้ textEdit.starticon และ passwordEdit.starticon คุณสมบัติเพื่อแสดงไอคอนในการควบคุม textEdit และรหัสผ่าน
< dxe : TextEdit LabelText = " Login " StartIcon = " editorsname " .../>
< dxe : PasswordEdit LabelText = " Password " StartIcon = " editorspassword " .../>ไฟล์เพื่อดู: loginPage.xaml
ในการตรวจสอบความถูกต้องของผู้ใช้ในการควบคุมรหัสผ่านให้ใช้ EditBase.HasError และ EditBase.erRortext คุณสมบัติที่สืบทอดมา
< dxe : PasswordEdit ... HasError = " {Binding HasError} " ErrorText = " {Binding ErrorText} " />ไฟล์เพื่อดู: loginPage.xaml
public class LoginViewModel : BaseViewModel {
// ...
string errorText ;
bool hasError ;
// ...
public string ErrorText {
get => errorText ;
set => SetProperty ( ref errorText , value ) ;
}
public bool HasError {
get => hasError ;
set => SetProperty ( ref hasError , value ) ;
}
async void OnLoginClicked ( ) {
/// ...
string response = await DataStore . Authenticate ( userName , password ) ;
if ( ! string . IsNullOrEmpty ( response ) ) {
ErrorText = response ;
HasError = true ;
return ;
}
HasError = false ;
await Navigation . NavigateToAsync < SuccessViewModel > ( ) ;
}
}ไฟล์เพื่อดู: loginViewModel.cs
ระบุคุณสมบัติของ TextEdit.Returntype ที่สืบทอดมาเพื่อมุ่งเน้นการควบคุมรหัสผ่านหลังจากแก้ไขค่าของ TextEdit Control
ใช้คุณสมบัติ PasswordEdit.returnCommand เพื่อระบุคำสั่ง ( เข้าสู่ระบบ ) ที่ทำงานเมื่อผู้ใช้ป้อนรหัสผ่าน:
< dxe : PasswordEdit ReturnCommand = " {Binding LoginCommand} " />ไฟล์เพื่อดู: loginPage.xaml
public class LoginViewModel : BaseViewModel {
// ...
public LoginViewModel ( ) {
LoginCommand = new Command ( OnLoginClicked ) ;
SignUpCommand = new Command ( OnSignUpClicked ) ;
PropertyChanged +=
( _ , __ ) => LoginCommand . ChangeCanExecute ( ) ;
}
// ...
public Command LoginCommand { get ; }
public Command SignUpCommand { get ; }
// ...
}ไฟล์เพื่อดู: loginViewModel.cs
เราเปิดใช้งานการแคชรูปภาพในโครงการนี้ เพื่อให้บรรลุเป้าหมายนั้นเราจำเป็นต้องระบุภาพโดย URI ของพวกเขา ในการสร้าง URI เราใช้ multibinding ที่ได้รับชื่อโฮสต์และรหัสผู้แต่ง/โพสต์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแคชรูปภาพโปรดดูเอกสาร MAUI
< dx : DXImage >
< dx : DXImage .Source>
< MultiBinding StringFormat = " {}{0}PublicEndpoint/PostImage/{1} " >
< Binding Source = " {x:Static webService:WebAPIService.ApiUrl} " />
< Binding Path = " PostId " />
</ MultiBinding >
</ dx : DXImage .Source>
</ dx : DXImage >ไฟล์เพื่อดู: itemspage.xaml
Android Emulator และ iOS Simulator ขอใบรับรองเพื่อเข้าถึงบริการผ่าน HTTPS ในตัวอย่างนี้เราเปลี่ยนเป็น HTTP ในโหมดดีบัก:
#if ! DEBUG
app . UseHttpsRedirection ( ) ;
#endif< network-security-config >
< domain-config cleartextTrafficPermitted = " true " >
< domain includeSubdomains = " true " >10.0.2.2</ domain >
</ domain-config >
</ network-security-config >< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsLocalNetworking</ key >
< true />
</ dict >สิ่งนี้ช่วยให้คุณข้ามการตรวจสอบใบรับรองโดยไม่จำเป็นต้องสร้างใบรับรองการพัฒนาหรือใช้ตัวจัดการ httpClient
สำหรับข้อมูลเพิ่มเติมโปรดดูที่เชื่อมต่อกับบริการเว็บท้องถิ่นจาก Android Emulators และ iOS Simulators
เราขอแนะนำให้คุณใช้ HTTP เฉพาะเมื่อคุณพัฒนา/ดีบักแอปพลิเคชันของคุณ ในการผลิตใช้ HTTPS เพื่อเหตุผลด้านความปลอดภัย
(คุณจะถูกเปลี่ยนเส้นทางไปยัง DevExpress.com เพื่อส่งคำตอบของคุณ)