我的RBAC Web API是安全的,但是角色不起作用

时间:2017-06-02 12:13:51

标签: asp.net-web-api2 azure-active-directory rbac adal.js

我有一个简单的ADAL.js'spa'应用based on this sample。它调用的API是同一解决方案的一部分(因此,我不认为这是一个CORS问题,我们在这里都是同一个域..同一个应用程序)

我在AD租户的应用清单文件中设置了一些自定义角色。我将这些角色与一些测试用户帐户相关联。当我运行我的示例并登录时,它会向我反映用户令牌值,这些值表明正确的角色已应用于我决定登录的任何测试用户...

当我调用我们刚刚使用[Authorize]属性的API时,一切都很好。

例如,这个装饰的控制器,工作正常:

[Authorize]
public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get(){...omitted....}
}

但是,这给了我'拒绝'的回复(字面意思是:Authorization has been denied for this request):

[Authorize(Roles = "AdminAccess")]
public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()(){...omitted....}
}

我做错了什么?部署到Azure以及本地

时似乎失败

这是我的Startup.Auth.cs课程:

    public partial class Startup
    {
      public void ConfigureAuth(IAppBuilder app) {

        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                },
                Tenant = ConfigurationManager.AppSettings["ida:Tenant"],

            });
         }
       }
    }

1 个答案:

答案 0 :(得分:2)

您需要定义哪个声明包含角色。这是一个例子:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions()
    {
        Tenant = Tenant,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = ValidAudience,
            RoleClaimType = "roles"
        }
    });

这会导致中间件映射声明中的值&#34;角色&#34;到它创建的主体的角色。