我正在使用具有 .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/