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

My RBAC'd Web API is secure, but, the roles aren't working

我有一个简单的 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....}
}

但是,这给了我一个 'denied' 响应(字面意思: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 class:

    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"],

            });
         }
       }
    }

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

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

这会导致中间件将声明中的值 "roles" 映射到它创建的委托人的角色。