Xamarin Azure活动目录重定向URI错误

时间:2019-04-01 18:56:57

标签: c# xamarin.forms azure-active-directory

我正在开发需要通过Azure AD对用户进行身份验证的Xamarin应用,为此我正在使用Microsoft.Identity.Client块。

该应用程序能够转到Microsoft SSO页面,但是在单击登录按钮后,该页面将返回错误: AADSTS50011:请求中指定的回复URL与为该应用程序配置的回复URL不匹配:[ ApplicationID]

应用类别:

    public static string ClientID = [ApplicationID];

    public static string[] Scopes = { "User.Read" };
    public static string Username = string.Empty;

    public static UIParent UiParent { get; set; }

    public App()
    {
        InitializeComponent();
        PCA = new PublicClientApplication(ClientID);
        PCA.RedirectUri = $"msal{App.ClientID}://auth";
        //PCA.RedirectUri = $"AppSGA://auth";

        MainPage = new Paginas.Login();
    }

在构造函数的第四行中,如果我使用PCA.RedirectUri =“ AppSGA:// auth”;而不是PCA.RedirectUri = $“ msal {App.ClientID}:// auth”; 它不会返回错误,但sso页将永久加载而没有任何响应。

登录页面中的登录方法:

 private async void ADLogin()
    {
        AuthenticationResult authResult = null;
        IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync();

        try
        {
            IAccount firstAccount = accounts.FirstOrDefault();
            authResult = await App.PCA.AcquireTokenSilentAsync(App.Scopes, firstAccount);
            await UserDataAsync(authResult.AccessToken).ConfigureAwait(false);
        }
        catch (MsalUiRequiredException ex)
        {
            try
            {
                authResult = await App.PCA.AcquireTokenAsync(App.Scopes, App.UiParent);

                await UserDataAsync(authResult.AccessToken);
            }
            catch (Exception ex2)
            {

            }
        }
    }

在Azure上,该应用程序已注册:

名称:AppSGA

应用程序类型:本机

重定向URi:AppSGA:// auth

Azure上的应用清单:

   {
  "appId": AppID,
  "appRoles": [],
  "availableToOtherTenants": true,
  "displayName": "AppSGA",
  "errorUrl": null,
  "groupMembershipClaims": null,
  "optionalClaims": null,
  "acceptMappedClaims": null,
  "homepage": null,
  "informationalUrls": {
    "privacy": null,
    "termsOfService": null
  },
  "identifierUris": [],
  "keyCredentials": [],
  "knownClientApplications": [],
  "logoutUrl": null,
  "oauth2AllowImplicitFlow": true,
  "oauth2AllowUrlPathMatching": true,
  "oauth2Permissions": [],
  "oauth2RequirePostResponse": false,
  "objectId": [ObjectId],
  "parentalControlSettings": {
    "countriesBlockedForMinors": [],
    "legalAgeGroupRule": "Allow"
  },
  "passwordCredentials": [],
  "publicClient": true,
  "replyUrls": [
    "AppSGA://auth"
  ],
  "requiredResourceAccess": [
    {
      "resourceAppId": resourceAppId,
      "resourceAccess": [
        {
          "id": id,
          "type": "Scope"
        }
      ]
    },
    {
      "resourceAppId": resourceAppId
      "resourceAccess": [
        {
          "id": id,
          "type": "Scope"
        }
      ]
    }
  ],
  "samlMetadataUrl": null
}

有人知道这是什么原因吗?

2 个答案:

答案 0 :(得分:1)

这通常是因为在门户中配置的答复URL与您的应用程序指定的URL不同。这必须是完全匹配。

这里是修复此问题的教程。它用于App Services,但应用相同的步骤。:https://blogs.msdn.microsoft.com/jpsanders/2018/01/30/azure-app-service-error-aadsts50011-the-reply-address-http-azurewebsites-netsignin-oidc-does-not-match-the-reply-addresses-configured-for-the-application/

此更改有时需要花费几分钟的时间-我之所以经常被抓住是因为我在AAD中更改了此设置,但是认为它没有得到解决,因为它不能立即开始工作。

答案 1 :(得分:1)

PCA.RedirectUri = $"msal{App.ClientID}://auth";是使用MSAL时Xamarin Android和iOS的默认redirectUri格式。

这里是documentation on setting up the redirectUri for public clients

如果您使用的是Android,则需要在AndroidManifest.xml中添加以下内容:

<data android:scheme="msal{client_id}" android:host="auth" />

info on setting up Xamarin AndroidiOS

此外,您应该考虑更新到MSALv3.x。这是指向blog post的链接,概述了如何迁移到新的构建器模式以创建公共客户端和处理获取令牌调用。