Мой RBAC'd Web API безопасен, но роли не работают

У меня есть простое приложение "спа" ADAL.js на основе этого образца. Он вызывает API, являющийся частью одного и того же решения (поэтому я не думаю, что это проблема CORS, мы все в одном домене... одно и то же приложение)

Я настроил несколько пользовательских ролей в файле манифеста приложения моего AD-клиента. Я связал эти роли с некоторыми учетными записями пользователей. Когда я запускаю свой образец и вход в систему, он возвращает мне значения токенов пользователя, которые показывают, что правильная роль была применена к любому тестовому пользователю, с которым я решил войти...

Когда я звоню в API, где мы просто использовали [Authorize] атрибут, все хорошо.

Например, этот оформленный контроллер работает нормально:

[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 ответ

Решение

Вам необходимо определить, какая претензия содержит роли. Вот пример:

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

Это заставляет промежуточное ПО сопоставлять значения в утверждении "роли" с ролями для созданного им участника.

Другие вопросы по тегам