2015-12-03 3 views
2

Я пытаюсь использовать [Authorize (Roles = "test")] и/или вызывать User.IsInRole ("test") в тестовом приложении, и он не работает для меня. В конфигурации приложения на портале управления Azure я включил заявку SecurityGroup в манифест приложения, а также установил делегированные разрешения, чтобы разрешить «Читать все группы» и «Читать данные каталога». После этого я могу увидеть SID для тестовой группы в (ClaimsPrincipal.Current.Identity as ClaimsIdentity) .FindAll («groups»), но атрибут Authorize и вызов IsInRole не работают. Что-то еще необходимо, чтобы это работало?Использование атрибута Authorize с Azure Active Directory

ответ

3

Azure AD не отправляет группы в заявку на роль, и он не отправляет имя групп (в многопользовательской системе это не означает много: «admin» в contoso может иметь совершенно другую семантику от «admin» «в фабрикамах». Azure AD имеет новую конструкцию, которая представляет фактические роли, в отличие от группы. Если вы хотите проверить доступ к имени роли , см. https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims/blob/master/WebApp-RoleClaims-DotNet для примера с использованием ролей приложения. Если вы хотите проверить авторизацию вместо группы, вам нужно назначить тип заявки группы как RoleClaimType (в https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims/blob/master/WebApp-RoleClaims-DotNet/App_Start/Startup.Auth.cs вы можете увидеть, как это делается для ролей приложения), чтобы ASP.NET знал, что это требование, чтобы подтвердить, когда авторизация и IsInRole вступает в игру. Кроме того, учитывая, что вы не получили имя группы, вам необходимо выполнить проверку против объекта objectId. Если вы хотите использовать группы и проверять имена групп, это становится сложным. Вам нужно вызвать API-интерфейс графика, чтобы перевести ObjectId группы в его имя и соответственно увеличить входящую коллекцию заявок.

1

В ASP.NET 5 и MVC 6 все, что вам нужно сделать, это правильная настройка. Вот код, который работает как очарование для меня:

public void ConfigureApplication(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     ... 

     app.UseIISPlatformHandler(); 
     app.UseStaticFiles(); 

     app.UseCookieAuthentication(options => 
     { 
      options.AutomaticAuthenticate = true; 
     });    

     app.UseOpenIdConnectAuthentication(options => 
     { 
      options.AutomaticChallenge = true; 
      options.ClientId = Configuration.Get<string>("Authentication:AzureAd:ClientId"); 
      options.Authority = Configuration.Get<string>("Authentication:AzureAd:AADInstance") + "Common"; 
      options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 

      options.TokenValidationParameters = new TokenValidationParameters 
      { 
       ValidateIssuer = false, 
       RoleClaimType = "roles" 
      }; 
      options.Events = new OpenIdConnectEvents 
      { 
       OnAuthenticationValidated = (context) => Task.FromResult(0), 
       OnAuthenticationFailed = (context) => 
       { 
        context.Response.Redirect("/Home/Error"); 
        context.HandleResponse(); // Suppress the exception 
        return Task.FromResult(0); 
       }, 
       OnRemoteError = (context) => Task.FromResult(0) 
      }; 
     }); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(name: "default", template: "{controller=Dashboard}/{action=Index}/{id?}");     
     }); 

     DatabaseInitializer.InitializaDatabaseAsync(app.ApplicationServices).Wait(); 
    } 
Смежные вопросы