2017-11-25 3 views
2

다음과 같은 User.Identity.IsInProjectGroup(1)을 수행하여 사용자가 프로젝트 그룹에 있는지 확인할 수 있도록 클레임을 추가하거나 ID를 확장 할 수있는 방법은 다음과 같이 ApplicationUser 클래스입니다.ASP MVC 5 - ID 2.0 확장

현재 데이터베이스를 계속 방문하여 사용자를 얻고 IsInProjectGroup 메서드를 호출해야합니다.

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 
     Id = Guid.NewGuid().ToString(); 
     Groups = new Collection<Group>(); 
    } 

    public string FirstName { get; set; } 
    public ICollection<Group> Groups { get; set; } 

    public bool IsInProjectGroup(int projectId) 
    { 
     return Groups.Any(g => g.Projects.Select(x => x.Id).Contains(projectId)); 

    } 

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 

     // how do you add claim??? 
     userIdentity.AddClaim(new Claim("Group", ???)); 

     return userIdentity; 
    } 

} 

클레임을 추가하여 메소드를 호출하는 방법이 있습니까? 아니면이를 수행하는 다른 방법이 있습니까?

아래의 확장 메서드의 주장 확인하기 위해 내 ApplicationUser 클래스 내부에 이러한 주장을 추가하는 방법과 방법하지만 확실 다음과 같이 내가 확장의 생각 : 여기

namespace App.Extensions 
{ 
    public static class IdentityExtensions 
    { 
     public static bool IsInProjectGroup(this IIdentity identity, int projectId) 
     { 
      // how would i do the check here??? 
     } 
    } 
} 
+0

생성시 ID에 소유권 주장을 추가하기 만하면됩니다. – Nkosi

+0

@ Nkosi 몇 가지 코드로 보여 주실 수 있습니까? – adam78

+0

답변을 작성했지만 코드를 변경했습니다. 그룹이나 프로젝트를 찾고 있습니까? 정확히 무엇을 원하는지 명확히하십시오. – Nkosi

답변

2

간단한 예입니다.

먼저 당신이 만들 수 있습니다 검색을 위해 사용자의 신원

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { 
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
    // how do you add claim??? 
    if(Groups.Any()) { //assuming this is a navigation property 
     //create a claim type/name/key 
     //replace with you desired key. Store in a constant for later use 
     var claimName = Constants.Security.ClaimTypes.ProjectGroup; 
     //create claims from current groups. 
     var claims = Groups.SelectMany(g => g.Projects.Select(x => x.Id)) 
      .Select(id => new System.Security.Claims.Claim(claimName, id.ToString())); 
     userIdentity.AddClaims(claims); 
    } 
    return userIdentity; 
} 

를 만들 때

public class Constants { 
    public class Security { 
     public class ClaimTypes 
      public const string ProjectGroups = "ProjectGroups"; 
     } 
    } 
} 

그런 다음 주장을 만들 수 있습니다 주장에 대한 키로 사용하는 상수를 만드는 당신은 확장 메서드에 자신의 소유권 주장 자체 내의 그룹을 확인하고 데이터베이스에 도달하지 마십시오.

public static class IdentityExtensions { 
    public static bool IsInProjectGroup(this IIdentity identity, int projectId) { 
     // how would i do the check here??? 
     if(identity != null) { 
      var claimsIdentity = identity as ClaimsIdentity; 
      if (claimsIdentity != null) { 
       return claimsIdentity 
        .FindAll(Constants.Security.ClaimTypes.ProjectGroups) 
        .Any(claim => claim.Value == projectId.ToString()); 
      } 
     } 
     return false; 
    } 
} 
+0

귀하의 코드를 시도했지만 아무런 클레임도 추가되지 않았습니다. 로그 아웃하고 다시 로그인했는데 내 컨트롤러에서'User.Identity.IsInProjectGroup (1)'을 호출하려고하면 항상 false입니다. 데이터베이스의 UserClaims 테이블을 검사했는데 그 테이블도 비어 있습니다. 무슨 일이 일어날 수 있니? – adam78

+0

@ adam78 글쎄 그룹 속성에 저장하고있는 것과 관련이 있습니다. 내 가정은 그룹스가 채워 졌다는 것입니다. 코드는 소리입니다. 데이터가 없으면 그것은 분명 비어있을 것입니다. – Nkosi

+0

은 클레임 정답에 대한 제 이해입니다. 즉, UserClaims 테이블 또는 쿠키로 저장됩니까? 나는 다음과 같은 테스트를 추가하려고 시도했다 :'userIdentity.AddClaim (새로운 클레임 ("FirstName", FirstName)); 그리고 그 역시 UserClaims 테이블에 저장되지 않는다? – adam78