我正在使用带有C#后端的Xamarin.Forms重写我们的应用程序,并且我试图在登录时使用customauth。我已经让它工作到了一定程度,但我正在努力从后端传回我想要的所有Xamarin应用程序。我获得了令牌和用户ID,但想要更多。
成功登录的后端代码似乎相对简单:
return Ok(GetLoginResult(body));
其中GetLoginResult()是:
private object GetLoginResult(IUser body)
{
var claims = new Claim[]
{
new Claim(JwtRegisteredClaimNames.Sub, body.username)
};
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(
claims, signingKey, audience, issuer, TimeSpan.FromDays(30));
accounts account = db.accounts.Single(u => u.username.Equals(body.username));
return new LoginResult(account)
{
authenticationToken = token.RawData,
};
}
和LoginResult类是
public class LoginResult
{
public LoginResult(accounts account)
{
Response = 200;
CustomerId = account.CustomerId;
Modules = account.Modules;
User = new LoginResultUser
{
userId = account.id,
UserName = account.UserName,
EmployeeId = account.EmployeeId
};
}
[JsonProperty(PropertyName = "Response")]
public int Response { get; set; }
等
在应用程序中,我按如下方式调用惯例:
MobileServiceUser azureUser = await _client.LoginAsync("custom", JObject.FromObject(account));
结果有令牌和正确的用户ID但是如何用后端传回的附加属性填充结果?我已经让后端工作并使用邮递员进行测试,我得到的结果是我想要的,但我一直无法找到如何在应用程序中反序列化。
答案 0 :(得分:0)
众所周知,对于自定义身份验证,MobileServiceClient.LoginAsync
会调用https://{your-app-name}.azurewebsites.net/.auth/login/custom
。使用ILSPy时,您会发现此方法只会从响应中检索user.userId
和authenticationToken
,以构建CurrentUser
的{{1}}。根据我的理解,您可以利用MobileServiceClient
在用户成功登录后检索其他用户信息。此外,您可以尝试按照此toturial进行其他可能的方法。
<强>更新强>
您可以使用MobileServiceClient.InvokeApiAsync
代替InvokeApiAsync
直接调用自定义登录端点,然后检索响应并获取其他参数,如下所示:
成功记录后,我添加了一个新属性LoginAsync
并按如下方式响应客户端:
对于客户端,我添加了一个自定义扩展方法,用于记录和检索其他参数,如下所示:
以下是代码段,您可以参考它们:
<强> MobileServiceLoginExtend.cs 强>
userName
登录处理
public static class MobileServiceLoginExtend
{
public static async Task CustomLoginAsync(this MobileServiceClient client, LoginAccount account)
{
var jsonResponse = await client.InvokeApiAsync("/.auth/login/custom", JObject.FromObject(account), HttpMethod.Post, null);
//after successfully logined, construct the MobileServiceUser object with MobileServiceAuthenticationToken
client.CurrentUser = new MobileServiceUser(jsonResponse["user"]["userId"].ToString());
client.CurrentUser.MobileServiceAuthenticationToken = jsonResponse.Value<string>("authenticationToken");
//retrieve custom response parameters
string customUserName = jsonResponse["user"]["userName"].ToString();
}
}