Azure MobileServiceClient无法在ASP.NET中对用户进行身份验证

时间:2015-01-26 10:07:33

标签: asp.net authentication azure oauth azure-mobile-services

我在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管理门户中的所有提供程序。 请帮忙

1 个答案:

答案 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始终使用广告代码。

我不确定这是否是一种可以接受的做法,但它确实有效,也许这会帮助像我这样的人挣扎来对抗天蓝认证