2017-08-21 63 views
0

我正在嘗試爲Owin創建多個應用程序的身份驗證服務器。授予憑據時過濾擴展IdentityUserRole

爲此,我將clientId添加到我的AspNetUserRole表中,就像這樣。

public class ApplicationUserRoles : IdentityUserRole 
{ 
    public ApplicationUserRoles() : base() { } 

    [Key] 
    public string ClientId { get; set; } 

    [ForeignKey("ClientId")] 
    public Audience Client { get; set; } 

} 

這工作正常。

我無法找到的是我在做GrantResourceOwnerCredentials時重寫角色列表創建的位置,所以我只能過濾當前cilentId的角色。

我試圖改變它在UserManager FindAsync(username,password)但角色是隻讀的。

我也許我應該重寫UserStore上的某些東西,但我不確定哪種方法應該被覆蓋,以及如何確定我正在加載所有其他數據,如聲明和登錄並檢查所有安全問題它已經做到了。

任何想法將不勝感激。

回答

0

好吧 我敢肯定,這不是最好的答案,但它的工作原理,我敢肯定,它不會改變任何契約流程。

我改變了我的ApplicationUserManager創建身份的方法。我以owin創建的身份,刪除它已有的角色聲明,並從角色中添加新的角色。

public override async Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser user, string authenticationType) 
    { 

      var identityClaims = await base.CreateIdentityAsync(user, authenticationType); 
     List<Claim> claimsDelete = new List<Claim>(); 
     foreach (var claim in identityClaims.Claims) 
     { 
      if (claim.Type == ClaimTypes.Role) 
       claimsDelete.Add(claim); 
     } 

     foreach(var claim in claimsDelete) 
      identityClaims.TryRemoveClaim(claim); 

     var roleStore = new RoleStore(); 
     var roles = roleStore.GetAll(); 

     for (int i = 0; i < user.Roles.Count(); i++) 
      { 

       if (((ApplicationUserRoles)((List<IdentityUserRole>)user.Roles)[i]).ClientId == this.clientId) 
       { 
        identityClaims.AddClaim(new Claim(ClaimTypes.Role, roles[((List<IdentityUserRole>)user.Roles)[i].RoleId])); 
       } 

      } 


     return identityClaims; 
    }