2017-09-19 108 views
1

我在Azure中創建了WebApp。我有基於AzureAD的認證...在Web應用程序中獲取Azure角色

其實所有的用戶都有相同的權利......我需要有一組管理員和世界其他地方。

我看到,在Azure的門戶我的web應用程序有一些地方角色中列出的Acces control (IAM) ... enter image description here 我可以在我的應用程序使用這些角色?

其實我在我看來,做的是:

​​

如果我理解正確的是被命名爲「基於聲明」的認證,但我想嘗試使用角色 Based驗證...

我想也是這樣做

var userIdentity = (System.Security.Claims.ClaimsIdentity)User.Identity; 
var claims = userIdentity.Claims; 
var roleClaimType = userIdentity.RoleClaimType; 
var roles = claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.Role).ToList(); 

但角色列表是空的...

這裏是在public void Configure(IApplicationBuilder app,...

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{ 
    ClientId = Configuration["Authentication:AzureAd:ClientId"], 
    Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"], 
    CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"], 
    Events = new OpenIdConnectEvents 
    { 
     OnTicketReceived = async context => 
     { 
      var user = (ClaimsIdentity)context.Ticket.Principal.Identity; 
      if (user.IsAuthenticated) 
      { 
       var firstName = user.FindFirst(ClaimTypes.GivenName).Value; 
       var lastName = user.FindFirst(ClaimTypes.Surname).Value; 
       var email = user.HasClaim(cl => cl.Type == ClaimTypes.Email) ? user.FindFirst(ClaimTypes.Email).Value : user.Name; 
       var connectedOn = DateTime.UtcNow; 
       var userId = user.Name; 
       var myUser = await repository.GetAsync<Connection>(userId); 
       if (myUser == null) 
       { 
        myUser = new Connection(userId) 
        { 
         FirstName = firstName, 
         LastName = lastName, 
         Email = email 
        }; 
       } 
       myUser.LastConnectedOn = connectedOn; 
       List<Connection> myList = new List<Connection>() { myUser }; 
       var results = await repository.InsertOrMergeAsync(myList); 
       Claim clm = new Claim("IsAdmin", myUser.IsAdmin.ToString(), ClaimValueTypes.Boolean); 
       user.AddClaim(clm); 
      } 
      return; 
     } 
     }, 
    } 
}); 

的我Startup.cs Autentication代碼,也是我appsettings.json

"Authentication": { 
    "AzureAd": { 
    "AADInstance": "https://login.microsoftonline.com/", 
    "CallbackPath": "/signin-oidc", 
    "ClientId": "xxxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxx", 
    "Domain": "mysite.azurewebsites.net", 
    "TenantId": "xxxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxx" 
    } 
} 

回答

1

我相信你在門戶中觀察到的角色有關的管理Web Apps,而不是它公開的功能的授權。 要以編程方式使用角色,我建議您查看以下示例,其中介紹瞭如何在Azure AD應用程序中設置與您作爲Web App部署的項目相對應的角色。 https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims

這樣你就可以保護頁面(從控制器代碼)使用屬性: ``

[Authorize(Roles = "Admin, Observer, Writer, Approver")] 

https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims/blob/master/WebApp-RoleClaims-DotNet/Controllers/TasksController.cs#L17

您還可以測試其用戶給定角色: if (User.IsInRole("Admin") || User.IsInRole("Writer")) { ... }

+0

對我來說主要問題是如何創建角色...... $ approverRole = CreateAppRole的用法-Name 「批准者」 - 描述「批准者有能力改變任務的狀態。」'有點模糊不清......上述示例中的 – Serge

+0

正在談論Manifest和web.config我在ASP.NET中沒有這樣的東西核心應用程序...如果我理解的很好,RoleManager已經實現了.Core框架...另外我使用的是AzureTable Storage而不是Sql/CoreFramework ...所以我不能採用IdentityUser ... – Serge

+0

清單可以在Azure門戶中找到。查找Azure Active Directory - >應用程序註冊 - >您的應用程序 - >清單。 – juunas

相關問題