我在ASP.NET 5.0中为Azure移动服务进行OAuth .NET后端身份验证时遇到了麻烦。我正在尝试使用Facebook,Twitter,Google和Microsoft实现外部登录。
我成功从所有外部源获取access_token,然后尝试登录MobileServiceClient。
这是我的代码
var app = System.Web.HttpContext.Current.Items["AzureClient"] as MobileServiceClient;
app.Logout();
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
var accesToken = loginInfo.ExternalIdentity.Claims.FirstOrDefault(c => c.Type == "access_token");
MobileServiceUser user = null;
if (providerName == "Microsoft")
{
user = await app.LoginWithMicrosoftAccountAsync(accessToken);
}
else
{
var token = new JObject();
token.Add("access_token", accessToken);
user = await app.LoginAsync(loginInfo.Login.LoginProvider, token);
}
我正在通过身份验证,但只有facebook令牌。微软和谷歌抛出401未经授权的例外。 Twitter抛出“方法不允许”。我错了什么? 我已经仔细检查了应用程序密钥和应用程序密钥是否已填充到azure管理门户中的所有提供程序。 请帮忙
答案 0 :(得分:0)
我不确定来自社交网络的令牌是否可以转发到MobileServiceClient,但它适用于Facebook并且不与所有其他人一起使用。我对这种行为感到很困惑;
我最终创建了一个ActiveDirectory应用程序,并使用ADAL AcquireToken方法为我的MobileServicesClient获取AD令牌。正如这里所描述的那样 Azure Website Single Sign On accessing Azure Mobile Service from Azure Active Directory as User
这是我从AD获取令牌的方法
private string GetAdToken()
{
string clientID = "<clientId>";
string authority = "<AuthorityUrl>";
string resourceURI = "<WebApiUrl>";
var appKey = "<applicationKey>";
var ac = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority);
var clientCredential = new ClientCredential(clientID, appKey);
var ar = ac.AcquireToken(resourceURI, clientCredential);
Session["token"] = ar.AccessToken;
return ar.AccessToken;
}
这是我在通过MobileServiceClient查询Azure数据表之前运行的方法。
private async Task<MobileServiceUser> EnsureLogin()
{
var app = System.Web.HttpContext.Current.Items["AzureClient"] as MobileServiceClient;
app.Logout();
JObject token = new JObject();
token["access_token"] = Session["token"].ToString();
return await app.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, token);
}
所以现在它并没有满足我用来登录我的Web应用程序的提供程序。 MobileServiceClient始终使用广告代码。
我不确定这是否是一种可以接受的做法,但它确实有效,也许这会帮助像我这样的人挣扎来对抗天蓝认证