Xamarin,Azure,customauth和传递参数

时间:2017-03-14 20:58:44

标签: c# azure xamarin xamarin.forms custom-authentication

我正在使用带有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但是如何用后端传回的附加属性填充结果?我已经让后端工作并使用邮递员进行测试,我得到的结果是我想要的,但我一直无法找到如何在应用程序中反序列化。

1 个答案:

答案 0 :(得分:0)

众所周知,对于自定义身份验证,MobileServiceClient.LoginAsync会调用https://{your-app-name}.azurewebsites.net/.auth/login/custom。使用ILSPy时,您会发现此方法只会从响应中检索user.userIdauthenticationToken,以构建CurrentUser的{​​{1}}。根据我的理解,您可以利用MobileServiceClient在用户成功登录后检索其他用户信息。此外,您可以尝试按照此toturial进行其他可能的方法。

<强>更新

您可以使用MobileServiceClient.InvokeApiAsync代替InvokeApiAsync直接调用自定义登录端点,然后检索响应并获取其他参数,如下所示:

成功记录后,我添加了一个新属性LoginAsync并按如下方式响应客户端:

enter image description here

对于客户端,我添加了一个自定义扩展方法,用于记录和检索其他参数,如下所示:

enter image description here

以下是代码段,您可以参考它们:

<强> 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();
    }
}