MAUI Blazor系列目录

  1. MAUI Blazor学习1-移动客户端Shell布局 - SunnyTrudeau - 博客园 (cnblogs.com)
  2. MAUI Blazor学习2-创建移动客户端Razor页面 - SunnyTrudeau - 博客园 (cnblogs.com)
  3. MAUI Blazor学习3-绘制ECharts图表 - SunnyTrudeau - 博客园 (cnblogs.com)
  4. MAUI Blazor学习4-绘制BootstrapBlazor.Chart图表 - SunnyTrudeau - 博客园 (cnblogs.com)
  5. MAUI Blazor学习5-BLE低功耗蓝牙 - SunnyTrudeau - 博客园 (cnblogs.com)
  6. MAUI Blazor学习6-扫描二维码 - SunnyTrudeau - 博客园 (cnblogs.com)

 

登录是APP的基本功能,采用Identity Server 4认证服务器,Blazor Server可以简单配置一下oidc参数,即可跳转到id4服务器登录。APP可以在登录页面填写用户名和密码,发送到id4认证服务器。MAUI Blazor可以用这种方式实现登录功能。

2021年11月,在MAUI Blazor还在预览版的时候,我写了一个DEMO,实现了访问Id4服务器登录功能。现在把APP的代码直接搬到正式版,也是没问题的。

Blazor MAUI客户端访问Identity Server登录 - SunnyTrudeau - 博客园 (cnblogs.com)

DEMO代码地址:https://gitee.com/woodsun/blzid4

 

id4认证服务端支持手机号验证码登录方案

沿用2021年DEMO的id4服务器,把AspNetId4Web项目复制到本解决方案。

回顾一下方案。config自定义一个PhoneCodeGrantType认证类型,通过手机号和验证码,返回token。

 

复制代码

复制代码

 

自定义手机验证码认证处理器。

复制代码

复制代码

把自定义手机验证码认证处理器PhoneCodeGrantValidator注册到id4认证服务。

 

复制代码

复制代码

 

注意要修改一下ProfileService,如果是Code方式访问id4,可以获取到所需的claims,但是自定义的PhoneCodeGrantType方式访问id4,只能获取到nation。调试发现context.Subject也只有nation一个claim,context.Subject.FindAll(JwtClaimTypes.Name)根本无法获取到用户名等所需用户属性。我试过注解掉我写的ProfileService,id4会用内置的ProfileService,返回的claims多一点,也不满足需求。我不知道问题出在哪里,但是知道怎么解决这个问题,就是ProfileService直接返回所需的用户属性即可,不判断context.Subject。

 

复制代码

复制代码

 

 

APP增加用户管理功能

基于本系列MaBlaApp项目,把2021年DEMO的MAUI Blazor客户端项目BlaMauiApp的代码复制过来使用。

NuGet安装IdentityModel

<PackageReference Include="IdentityModel" Version="4.6.0" />

 

登录用户信息类LoginUserInfo不用改。

D:\Software\gitee\blzid4\BlzId4Web\BlaMauiApp\Data\LoginUserInfo.cs

 

复制代码

复制代码

 

登录用户管理器LoginUserManager稍微优化一下,之前用文件保存登录用户信息,现在改用Preferences,更加方便。

D:\Software\gitee\mauiblazorapp\MaBlaApp\Data\LoginUserManager.cs

复制代码

复制代码

手机验证码登录功能模块Ids4Client改为从access token解析claims,获取用户属性。

D:\Software\gitee\mauiblazorapp\MaBlaApp\Data\Ids4Client.cs

 

复制代码

复制代码

 

注册认证功能模块。NuGet安装Microsoft.Extensions.Http

D:\Software\gitee\mauiblazorapp\MaBlaApp\MauiProgram.cs

 

复制代码

复制代码

 

主页增加显示登录用户信息,如果当前没有登录信息的话,自动跳转到登录页面。如果不需要这个功能,注解OnInitializedAsync即可。

D:\Software\gitee\mauiblazorapp\MaBlaApp\Pages\Index.razor

复制代码

复制代码

登录页面PhoneCodeLogin不用改。

复制代码

复制代码

测试登录

把服务端AspNetId4Web项目和客户端MaBlaApp项目跑起来。登录页面只是遮盖了index主页,还是可以切换到其他页面。

为了解决这个问题,登录页面要引用一个遮盖MainPage的LoginLayout。

 

复制代码

复制代码

 

登录页面引用这个LoginLayout布局。

D:\Software\gitee\mauiblazorapp\MaBlaApp\Pages\PhoneCodeLogin.razor

@layout LoginLayout

再次运行,登录页面遮盖了整个APP,满足需求。

同时运行AspNetId4Web认证服务器和MaBlaApp客户端项目,输入种子用户alice的手机号13512345001,获取验证码,在AspNetId4Web项目的控制台可以看到验证码,填写到MaBlaApp网页,即可登录。登录成功后,可以显示获取到的用户属性。

查看AspNetId4Web项目控制台输出:

[16:58:37 Information] IdentityServer4.Validation.TokenRequestValidator

Token request validation success, {"ClientId": "PhoneCode", "ClientName": "PhoneCode", "GrantType": "PhoneCodeGrantType", "Scopes": "openid profile role scope1", "AuthorizationCode": null, "RefreshToken": null, "UserName": null, "AuthenticationContextReferenceClasses": null, "Tenant": null, "IdP": null, "Raw": {"client_Id": "PhoneCode", "client_secret": "***REDACTED***", "grant_type": "PhoneCodeGrantType", "scope": "openid profile scope1 role", "PhoneNumber": "13512345001", "VerificationCode": "2747"}, "$type": "TokenRequestValidationLog"}

 

[16:58:37 Debug] IdentityServer4.Services.DefaultClaimsService

Getting claims for access token for client: PhoneCode

 

[16:58:37 Debug] IdentityServer4.Services.DefaultClaimsService

Getting claims for access token for subject: d2f64bb2-789a-4546-9107-547fcb9cdfce

 

[16:58:38 Information] IdentityServer4.Events.DefaultEventService

{"ClientId": "PhoneCode", "ClientName": "PhoneCode", "RedirectUri": null, "Endpoint": "Token", "SubjectId": "d2f64bb2-789a-4546-9107-547fcb9cdfce", "Scopes": "openid profile role scope1", "GrantType": "PhoneCodeGrantType", "Tokens": [{"TokenType": "access_token", "TokenValue": "****Kenw", "$type": "Token"}], "Category": "Token", "Name": "Token Issued Success", "EventType": "Success", "Id": 2000, "Message": null, "ActivityId": "0HMOIATNCVSRE:00000005", "TimeStamp": "2023-02-19T08:58:38.0000000Z", "ProcessId": 17392, "LocalIpAddress": "::1:5000", "RemoteIpAddress": "::1", "$type": "TokenIssuedSuccessEvent"}

 

[16:58:38 Debug] IdentityServer4.Endpoints.TokenEndpoint

Token request success.

 

MaBlaApp网页显示用户属性:

DEMO代码地址:https://gitee.com/woodsun/mauiblazorapp

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。