Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure AD例外情况-AADSTS50105-“;未将已登录用户分配给应用程序的角色";_C#_Azure_Azure Active Directory - Fatal编程技术网

C# Azure AD例外情况-AADSTS50105-“;未将已登录用户分配给应用程序的角色";

C# Azure AD例外情况-AADSTS50105-“;未将已登录用户分配给应用程序的角色";,c#,azure,azure-active-directory,C#,Azure,Azure Active Directory,我正在使用Azure AD为ASP.NET Web API 2 REST API设置身份验证。我希望所有客户端都能够使用用户名和密码通过RESTAPI进行身份验证。我已经安装了Azure AD(下面是完整的步骤,但本质上是创建目录、添加用户、添加应用程序、在清单中为应用程序添加角色、为应用程序分配用户)。但是,当我尝试通过控制台应用程序(底部的完整代码)进行测试时,会出现异常: Microsoft.IdentityModel.Clients.ActiveDirectory.AdalService

我正在使用Azure AD为ASP.NET Web API 2 REST API设置身份验证。我希望所有客户端都能够使用用户名和密码通过RESTAPI进行身份验证。我已经安装了Azure AD(下面是完整的步骤,但本质上是创建目录、添加用户、添加应用程序、在清单中为应用程序添加角色、为应用程序分配用户)。但是,当我尝试通过控制台应用程序(底部的完整代码)进行测试时,会出现异常:

Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException中发生类型为“
Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException
”的未处理异常

附加信息:AADSTS50105:已登录用户的test@azureadwebapitest.onmicrosoft.com'未分配给应用程序'8ed6bbe9-dce7-4bed-83af-aa5472ac4eef'的角色

我猜清单中有些东西需要调整,但我不知道

代码如下:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System;

namespace WebApiClientTest
{
    class Program
    {
        static void Main(string[] args)
        {
            const string authorityUri = "https://login.microsoftonline.com/azureadwebapitest.onmicrosoft.com/";
            const string resource = "https://azureadwebapitest.onmicrosoft.com/test";
            const string clientId = "8ed6bbe9-dce7-4bed-83af-aa5472ac4eef";
            const string userId = "test@azureadwebapitest.onmicrosoft.com";
            const string password = "[REMOVED for StackOverflow post]";

            UserCredential credentials = new UserCredential(userId, password);
            AuthenticationContext context = new AuthenticationContext(authorityUri);
            var authresult = context.AcquireToken(resource, clientId, credentials);
            Console.WriteLine("Access token: {0}", authresult.AccessToken);
            Console.ReadLine();
        }
    }
}
完整的重新编程步骤如下:

1。创建新的Azure广告目录:

2。添加新应用程序:

3。将“访问应用程序所需的用户分配”设置为“是”。设置“读取目录数据”应用程序权限。复制客户端ID。保存:

4。下载清单。编辑清单并添加两个角色。上传清单:

5。从步骤1返回目录并添加用户

6。打开新浏览器以用户身份登录。更改密码。注意:没有可用的应用程序:

7。回到经典门户。将用户分配到应用程序中的generalclient角色。请注意,用户现在已分配给应用程序

8。返回用户帐户门户并刷新。您可能需要刷新几次或四处单击。请注意,现在显示的是应用程序

  • 似乎在这一点上,设置应该是完整的

  • 创建一个新的控制台应用程序

  • 安装Nuget软件包“Microsoft.IdentityModel.Clients.ActiveDirectory”

  • 将代码复制到控制台应用程序(文章顶部),将密码插入“password”字符串,然后开始调试:

  • 结果:

    Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException中发生类型为“
    Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException
    ”的未处理异常

    附加信息:AADSTS50105:已登录用户的test@azureadwebapitest.onmicrosoft.com'未分配给应用程序'8ed6bbe9-dce7-4bed-83af-aa5472ac4eef'的角色

    预期结果:


    访问令牌将写入控制台输出。

    如果您在Azure中托管了Web API,并且希望用户能够使用它,那么您需要该资源的令牌

    角色将由Web API资源而不是测试发布。一旦认证,资源访问令牌将具有角色,您的Web API可以使用这些角色授予访问权限

    假设这不是多租户

    首先,您必须配置Web API资源并将其清单修改为 支持角色。这是通过修改清单中的
    appRoles
    键来完成的。 然后需要更新清单的
    oauth2Permissions
    ,以支持委托用户访问。查看此处(第5点)了解此信息

    现在,Web API已经准备好了,请转到其配置选项卡,并为特定角色分配一个any user let call it
    UserXYZ

    接下来,在设置Web API的同一目录中设置
    本机客户端应用程序
    ,并在其“配置”选项卡->添加应用程序中,选择Web API资源并选中它以进行委派访问

    回到您的测试应用程序中

     var uc = new UserCredential(userName, userPassword); // This is UserXYZ creds
     var context = new AuthenticationContext(...);  //Tenant Id must be correct
     result = context.AcquireToken("<Your Web API Resource App URI>", "<Your Native Client App Id>", uc);
    
    var uc=new UserCredential(用户名、用户密码);//这是UserXYZ creds
    var context=newauthenticationcontext(…)//租户Id必须正确
    结果=context.AcquireToken(“,”,uc);
    
    对于不同的场景,我遇到了类似的问题。原因是,登录用户不在应用程序用户列表中。当我在Azure AD目标应用程序(您通过c#代码引用的应用程序)中添加该用户时,这个错误就得到了解决。还要确保用户也是组的一部分。(如果不创建组,只需将应用程序用户添加为该组的成员即可。)

    为我工作:

    将属性
    需要用户分配?
    值更改为
    对我来说很有效。这可以在
    企业应用程序-->注册应用程序的名称-->属性下找到
    
    (干杯,您可以更改另一个角色(如“全局管理员”)并重试吗?如果您使用组,请避免嵌套组,尝试使用顶级组。感谢您的答复。不使用组。将用户在门户中的“组织角色”从“用户”更改为“全局管理员”,但仍然会遇到相同的异常。我还尝试添加了“全局管理员”和“全局管理员”到“AllowedMemberType”"在清单中,但在尝试使用其中一个值上载时收到错误。您无法使用webapi的clientid评估webapi,本机应用程序访问webapi是一个解决方案。您正在尝试从其自己的客户端id访问web api。这正是您不需要的。您需要注册本机客户端,从在你的代码中使用它的客户端id。你解决了这个问题吗?我面临着类似的问题