2014-09-04 5 views
0

이전 Microsoft.IdentityModel 클래스를 System.IdentityModel 클래스 (예 : .Net 4.5 프레임 워크)로 업그레이드 한 후에는 대부분의 MSTest 유닛 PrincipalPermissionAttribute를 사용하는 메소드를 호출하면 테스트가 실패하기 시작했습니다. 예를 들어PrincipalPermissionAttribute로 장식 된 메서드에 대해 SecurityException이 발생했습니다. .NET 4.5

:

우리의 단위 테스트를 우리가 같은 컨트롤러 메소드 호출하기 전에, 우리가 이전에 Thread.CurrentPrincipal을 설정 한 내
[RequireAuthentication] 
[PrincipalPermission(SecurityAction.Demand, Role = "AllowActAs")] 
public ActionResult ActAs(int id) 

: 그 접근 방식을 다시 시도

List<Microsoft.IdentityModel.Claims.Claim> claims = new List<Microsoft.IdentityModel.Claims.Claim>(); 
claims.Add(new Microsoft.IdentityModel.Claims.Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "Jamie")); 
claims.Add(new Microsoft.IdentityModel.Claims.Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "1234567890")); 
claims.Add(new Microsoft.IdentityModel.Claims.Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "AllowActAs")); 

Microsoft.IdentityModel.Claims.ClaimsIdentityCollection claimsCollection = new Microsoft.IdentityModel.Claims.ClaimsIdentityCollection(); 
claimsCollection.Add(new Microsoft.IdentityModel.Claims.ClaimsIdentity(claims)); 

Microsoft.IdentityModel.Claims.ClaimsPrincipal new_principal = new Microsoft.IdentityModel.Claims.ClaimsPrincipal(claimsCollection); 
Thread.CurrentPrincipal = new_principal; 

을 객체를 새로운 클래스로 이동하면 다음과 같이됩니다.

List<System.Security.Claims.Claim> claims = new List<System.Security.Claims.Claim>(); 
claims.Add(new System.Security.Claims.Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "Jamie")); 
claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "1234567890")); 
claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "AllowActAs")); 

List<System.Security.Claims.ClaimsIdentity> claimsCollection = new List<System.Security.Claims.ClaimsIdentity>(); 
claimsCollection.Add(new System.Security.Claims.ClaimsIdentity(claims)); 

System.Security.Claims.ClaimsPrincipal new_principal = new System.Security.Claims.ClaimsPrincipal(claimsCollection); 
Thread.CurrentPrincipal = new_principal; 

하우 ver, target.ActAs(id)을 호출 할 때마다 SecurityException이 발생합니다. 나는 이 아니며, 사용자가 지정된 역할을 수행하지 않는 한 실제로 웹 사이트를 사용할 때이 예외가 발생하지 않는다는 점에 유의해야한다. 따라서 이것은 MSTest 환경과 관련이있다.

컨트롤러 메서드를 호출하기 직전에 단위 테스트에서 브레이크 포인트를 설정하고 시계에서 Thread.CurrentPrincipal.IsInRole("AllowActAs")을 확인하면 그 결과는 true입니다. 나는 현재 스레드에 GenericPrincipal을 사용하는 경우

또한, 그것은 방법에 대한 액세스 권한을 부여, 그래서 그것은 ClaimsPrincipal 함께 할 수있는 뭔가가하는 오전 :

GenericPrincipal new_principal = new GenericPrincipal(
    new GenericIdentity("Jamie"), 
    new string[] { "AllowActAs" } 
); 

Thread.CurrentPrincipal = new_principal; 

사람에 대한 어떤 아이디어가 있습니까을 연결이 끊어 졌을 수도 있니? 반환

전체 예외입니다 :

System.Security.SecurityException: Request for principal permission failed. 
    at System.Security.Permissions.PrincipalPermission.ThrowSecurityException() 
    at System.Security.Permissions.PrincipalPermission.Demand() 
    at System.Security.PermissionSet.DemandNonCAS() 
    at Stepp.ProclaimCrm.PortalUI.Controllers.ImpersonateController.ActAs(Int32 id) in c:\ProclaimCRM\ProclaimCRM Portal\Portal-9373-Portal-Based-Accounts\Portal Web Front-End\Controllers\ImpersonateController.cs:line 79 
    at Portal_Web_Front_End_Test.ImpersonateTests.ActAsTestPersonWhoHasPreventActAs() in c:\ProclaimCRM\ProclaimCRM Portal\Portal-9373-Portal-Based-Accounts\Portal Web Front-End Test\Controllers\ImpersonateTests.cs:line 465 
The action that failed was: 
Demand 
The type of the first permission that failed was: 
System.Security.Permissions.PrincipalPermission 
The first permission that failed was: 
<IPermission class="System.Security.Permissions.PrincipalPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
version="1"> 
<Identity Authenticated="true" 
Role="AllowActAs"/> 
</IPermission> 

The demand was for: 
<IPermission class="System.Security.Permissions.PrincipalPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
version="1"> 
<Identity Authenticated="true" 
Role="AllowActAs"/> 
</IPermission> 

The assembly or AppDomain that failed was: 
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
+0

은'SecurityException'는 문제가 무엇이라고 말합니까를? –

+0

전체 예외 메시지 및 스택 추적으로 오류를 업데이트했습니다. –

+0

중단 점에서 상태를 언급 한 것으로 나타났습니다. 그러나, 나는이 예외가'ActAsTestPersonWhoHasPreventActAs()'라는 테스트 메소드에서 온 것임을 알 수 없다. 이 메소드 이름은 실제로 반대의 경우를 테스트하는 것, 즉이 사람에게 허가를 부여해서는 안되기 때문에 예외가 성공적인 테스트 결과로 예상된다는 것을 의미하는 것으로 보입니다. 시험을 망가 뜨리는 것에서 업그레이드로 인해 작업이 시작될 가능성이 있습니까? –

답변

0

드디어이 알아 냈어. 나는 오류 메시지를 잘못 이해했다. 역할을 언급했지만 실제 문제는 System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticatedfalse입니다. ClaimsIdentity.AuthenticationType이 비어 있지 않은 문자열로 설정된 경우 IsAuthenticated (http://msdn.microsoft.com/en-us/library/system.security.claims.claimsidentity.isauthenticated(v=vs.110).aspx)의 MSDN 페이지에 따르면 IsAuthenticated는 true를 반환합니다.

당신이 인증 유형을 지정할 수 있습니다 ClaimsPrincipal의 생성자는 "테스트"인증 유형이 내 문제 해결 추가, 거기 때문에 :

List<System.Security.Claims.Claim> claims = new List<System.Security.Claims.Claim>(); 
claims.Add(new System.Security.Claims.Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "Jamie")); 
claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "1234567890")); 
claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "AllowActAs")); 

List<System.Security.Claims.ClaimsIdentity> claimsCollection = new List<System.Security.Claims.ClaimsIdentity>(); 
claimsCollection.Add(new System.Security.Claims.ClaimsIdentity(claims, "Test")); // specify authentication type here!! 

System.Security.Claims.ClaimsPrincipal new_principal = new System.Security.Claims.ClaimsPrincipal(claimsCollection); 
Thread.CurrentPrincipal = new_principal;