c# - Azure 移动应用程序 - 自定义身份验证 - 无法登录

标签 c# asp.net authentication xamarin.forms azure-mobile-services

我正在使用具有 .NET 背景的 Xamarin Forms 移动应用程序。我尽可能地遵循了指南。但是这些在某种程度上是未完成的,并且没有自定义身份验证的完整示例。我终于达到了一个点,我现在不知道如何前进。我无法登录。

客户端收到 LoginAsync 的响应后出现此错误:

     user = await TodoItemManager.DefaultManager.CurrentClient.LoginAsync("CustomAuth", credentials);

这是错误:

ex {"Object reference not set to an instance of an object."} System.Exception {System.NullReferenceException}

如果我使用像 Google+ 这样的默认提供商,效果会很好。所以我认为问题出在后端。但我不知道我做错了什么。我多次循环代码,看起来不错。 我尝试调试服务器端,但在它到达客户端之前我没有收到任何错误。

我做错了什么?

这是我在服务器端的代码。

    public IHttpActionResult Post(LoginRequest loginRequest)
    {
        if (isValidAssertion(loginRequest.username, loginRequest.password)) // user-defined function, checks against a database
        {
            JwtSecurityToken token = GetAuthenticationTokenForUser(loginRequest.username);

            return Ok(new
            {
                AuthenticationToken = token.RawData,
                User = new { UserId = loginRequest.username }
            });
        }
        else // user assertion was not valid
        {
            return Unauthorized();
        }
    }

辅助功能:

    private bool isValidAssertion(string username, string password)
    {
        AspNetUsers AspNetUser = db.AspNetUsers.SingleOrDefault(x => x.UserName.ToLower() == username.ToLower());
        return AspNetUser != null && VerifyHashedPassword(AspNetUser.PasswordHash, password);
    }

    private JwtSecurityToken GetAuthenticationTokenForUser(string username)
    {
        var claims = new Claim[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, username)
        };

        string signingKey = "123456789123456789...";//Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY");
        string audience = "https://todo.azurewebsites.net/"; // audience must match the url of the site
        string issuer = "https://todo.azurewebsites.net/"; // audience must match the url of the site

        JwtSecurityToken token = AppServiceLoginHandler.CreateToken(
            claims,
            signingKey,
            audience,
            issuer,
            TimeSpan.FromHours(24)
        );

        return token;
    }

在 Startup 类中我添加了:

        config.Routes.MapHttpRoute("CustomAuth", ".auth/login/CustomAuth", new { controller = "CustomAuth" });

这是我在客户端的代码:

    public async Task<bool> Authenticate()
    {
        string username = "todo@gmail.com";
        string password = "todo";

        string message = string.Empty;
        var success = false;
        var credentials = new JObject
        {
            ["username"] = username,
            ["password"] = password
        };
        try
        {
            user = await TodoItemManager.DefaultManager.CurrentClient.LoginAsync("CustomAuth", credentials);
            if (user != null)
            {
                success = true;
                message = string.Format("You are now signed-in as {0}.", user.UserId);
            }
        }
        catch (Exception ex)
        {
            message = string.Format("Authentication Failed: {0}", ex.Message);
        }
        await new MessageDialog(message, "Sign-in result").ShowAsync();
        return success;
    }

感谢您的帮助。

编辑(解决方案):

我会为有同样问题的人澄清。错误是关于一些大写/小写差异。返回中的名称必须是“user”、“userId”和“authenticationToken”。就像这样:

        return Ok(new
        {
            authenticationToken = token.RawData,
            user = new { userId = loginRequest.username }
        });

最佳答案

看起来您的服务器响应有误。查看有效响应,它看起来需要:

{
    "user": "your-user-id",
    "authenticationToken": "the-jwt"
}

更正服务器代码的响应,看看是否有帮助。

关于c# - Azure 移动应用程序 - 自定义身份验证 - 无法登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38326019/

相关文章:

c# - 该条目已被添加

c# - 如何从 asp.net 中的自定义 FileUpload 获取文件流?

asp.net - 如何在 IIS 7 中更新 FX_schema.xml 文件?

ruby - 如何使用 Mechanize 登录和抓取站点

c# - 如何在 C# 中使用 StreamReader 从特定位置读取文件?

c# - 为什么双倍面积 = 0;?

c# - 菜单干扰我的 gridview 控件

asp.net - 在 AspNet vNext (MVC 6) 中将 NLog 与 asp-net 布局渲染器一起使用

php - 使用 PIN 码将用户登录到 Laravel

python - 谷歌应用程序引擎的顶级用户身份验证方法