如何将Xamarin.Forms客户端接入使用ASP.NET Core Identity的Razor Pages项目
实现方案
一、ASP.NET 5 服务端改造(复用原有Identity体系)
原有Razor Pages的Identity逻辑无需修改,只需新增适配移动端的能力即可:
- 引入JWT认证NuGet包,安装对应.NET 5版本的
Microsoft.AspNetCore.Authentication.JwtBearer包,在认证配置中保留原有Cookie认证供网页端使用,同时新增JWT认证方案作为移动端API的认证方式,JWT的密钥、发行人、受众参数配置在appsettings.json中即可。 - 新增独立的API控制器(如
AccountApiController),复用原有UserManager、SignInManager实现移动端专用接口:- 登录接口:接收用户名+密码参数,调用
CheckPasswordAsync验证账号有效性,验证通过后生成JWT令牌和用户基础信息返回给客户端 - 注册接口:接收账号、密码等注册参数,调用
CreateAsync创建Identity用户,创建成功后可直接返回JWT或提示注册完成 - 登出接口:可选实现JWT黑名单逻辑,接收客户端传的当前令牌后加入黑名单,无状态场景下也可仅靠客户端清除本地令牌完成登出
- 登录接口:接收用户名+密码参数,调用
- 第三方登录服务端配置:
- 分别在Facebook、Google开发者平台注册应用,拿到对应客户端ID和密钥,在认证服务配置中追加
AddFacebook()、AddGoogle()扩展方法,填入对应平台的参数,同时适配网页端和移动端的回调地址 - 新增第三方登录处理接口,接收移动端传入的第三方授权码,调用对应平台接口换取用户唯一标识和公开信息,匹配现有Identity账号:如果已有绑定的账号直接返回JWT,没有绑定则引导用户绑定自有账号或创建新的Identity账号后返回JWT
- 分别在Facebook、Google开发者平台注册应用,拿到对应客户端ID和密钥,在认证服务配置中追加
二、Xamarin.Forms 客户端实现
- 自有账号体系登录注册流程:
- 开发对应登录、注册页面,收集用户输入的账号密码后调用服务端对应API接口,拿到返回的JWT令牌后存储到
Xamarin.Essentials.SecureStorage做持久化存储 - 后续请求服务端需要授权的接口时,在HTTP请求头中添加
Authorization: Bearer {你的JWT令牌}即可通过服务端认证 - 登出逻辑直接清空本地存储的JWT和用户缓存信息即可,按需调用服务端登出接口
- 开发对应登录、注册页面,收集用户输入的账号密码后调用服务端对应API接口,拿到返回的JWT令牌后存储到
- 第三方登录流程:
- 调用
Xamarin.Essentials.WebAuthenticatorAPI拉起系统浏览器访问第三方授权地址,用户登录授权后会自动回调回你的应用,拿到第三方返回的授权码 - 将授权码传给服务端的第三方登录接口,拿到JWT后后续逻辑和自有账号登录完全一致
- 注意在Android、iOS平台的配置文件中添加对应回调URL的Scheme声明,保证授权完成后能正常跳回应用
- 调用
三、原有功能兼容说明
- 原有Razor Pages的页面逻辑、CRUD业务、权限控制完全不需要修改,新增的JWT认证和API接口不会影响原有网页端用户的使用
- 原有需要授权的业务逻辑如果需要给移动端开放,要么给原有PageHandler追加
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]注解,要么封装独立的API接口复用原有EF业务代码即可,不需要重写业务逻辑
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

