@@ -13,106 +13,83 @@ namespace DeviceProfileSample
13
13
{
14
14
public class Program
15
15
{
16
- public const string resource_vsts = "499b84ac-1321-427f-aa17-267ca6975798" ;
17
- public const string clientId_vs = "872cd9fa-d31f-45e0-9eab-6e460a02d1f1" ;
18
- public static void Main ( string [ ] args )
19
- {
20
- //============= Config [Edit these with your settings] =====================
21
- var vstsAccountUri = "https://mseng.VisualStudio.com" ;
22
- var restEndpoint = "_apis/projects?api-version=2.0" ;
23
- //==========================================================================
16
+ //============= Config [Edit these with your settings] =====================
17
+ internal const string vstsCollectionUrl = "https://myaccount.visualstudio.com" ; //change to the URL of your VSTS account; NOTE: This must use HTTPS
18
+ //==========================================================================
24
19
25
- UserData ( vstsAccountUri , restEndpoint ) ;
20
+ internal const string VSTSResourceId = "499b84ac-1321-427f-aa17-267ca6975798" ; //Static value to target VSTS. Do not change
21
+ internal const string clientId = "872cd9fa-d31f-45e0-9eab-6e460a02d1f1" ; //VS ClientId. Please use this instead of your app's clientId
26
22
27
- //prevents console from closing immediately at the end of output
28
- Console . ReadLine ( ) ;
29
- }
30
-
31
- static void UserData ( string vstsAccountUri , string restEndpoint )
23
+ public static void Main ( string [ ] args )
32
24
{
33
- //get auth token
34
- AuthenticationResult result = GetToken ( null ) ;
35
- var authHeader = new AuthenticationHeaderValue ( "Bearer" , result . AccessToken ) ;
36
-
37
- //call VSTS REST API
38
- using ( var client = new HttpClient ( ) )
25
+ AuthenticationContext ctx = GetAuthenticationContext ( null ) ;
26
+ AuthenticationResult result = null ;
27
+ try
39
28
{
40
- client . BaseAddress = new Uri ( vstsAccountUri ) ;
41
- client . DefaultRequestHeaders . Accept . Clear ( ) ;
42
- client . DefaultRequestHeaders . Accept . Add ( new System . Net . Http . Headers . MediaTypeWithQualityHeaderValue ( "application/json" ) ) ;
43
- client . DefaultRequestHeaders . Add ( "User-Agent" , "VstsRestApiSamples" ) ;
44
- client . DefaultRequestHeaders . Add ( "X-TFS-FedAuthRedirect" , "Suppress" ) ;
45
- client . DefaultRequestHeaders . Authorization = authHeader ;
46
-
47
- //connect to REST endpoint
48
- HttpResponseMessage response = client . GetAsync ( restEndpoint ) . Result ;
29
+ DeviceCodeResult codeResult = ctx . AcquireDeviceCodeAsync ( VSTSResourceId , clientId ) . Result ;
30
+ Console . WriteLine ( "You need to sign in." ) ;
31
+ Console . WriteLine ( "Message: " + codeResult . Message + "\n " ) ;
32
+ result = ctx . AcquireTokenByDeviceCodeAsync ( codeResult ) . Result ;
49
33
50
- if ( response . IsSuccessStatusCode )
51
- {
52
- Console . WriteLine ( "\t Successful REST call\n " ) ;
53
- Console . WriteLine ( response . Content . ReadAsStringAsync ( ) . Result ) ;
54
- }
55
- else
56
- {
57
- Console . WriteLine ( "{0}:{1}" , response . StatusCode , response . ReasonPhrase ) ;
58
- }
34
+ var bearerAuthHeader = new AuthenticationHeaderValue ( "Bearer" , result . AccessToken ) ;
35
+ ListProjects ( bearerAuthHeader ) ;
36
+ }
37
+ catch ( Exception ex )
38
+ {
39
+ Console . ForegroundColor = ConsoleColor . Red ;
40
+ Console . WriteLine ( "Something went wrong." ) ;
41
+ Console . WriteLine ( "Message: " + ex . Message + "\n " ) ;
59
42
}
60
43
}
61
44
62
- static AuthenticationResult GetToken ( string tenant )
45
+ private static AuthenticationContext GetAuthenticationContext ( string tenant )
63
46
{
64
47
AuthenticationContext ctx = null ;
65
48
if ( tenant != null )
66
49
ctx = new AuthenticationContext ( "https://login.microsoftonline.com/" + tenant ) ;
67
50
else
68
51
{
69
- ctx = new AuthenticationContext ( "https://login.microsoftonline.com /common" ) ;
52
+ ctx = new AuthenticationContext ( "https://login.windows.net /common" ) ;
70
53
if ( ctx . TokenCache . Count > 0 )
71
54
{
72
55
string homeTenant = ctx . TokenCache . ReadItems ( ) . First ( ) . TenantId ;
73
56
ctx = new AuthenticationContext ( "https://login.microsoftonline.com/" + homeTenant ) ;
74
57
}
75
58
}
76
- AuthenticationResult result = null ;
77
- try
78
- {
79
- result = ctx . AcquireTokenSilentAsync ( resource_vsts , clientId_vs ) . Result ;
80
- }
81
- catch ( Exception exc )
59
+
60
+ return ctx ;
61
+ }
62
+
63
+ private static void ListProjects ( AuthenticationHeaderValue authHeader )
64
+ {
65
+ // use the httpclient
66
+ using ( var client = new HttpClient ( ) )
82
67
{
83
- var adalEx = exc . InnerException as AdalException ;
84
- if ( ( adalEx != null ) && ( adalEx . ErrorCode == "failed_to_acquire_token_silently" ) )
68
+ client . BaseAddress = new Uri ( vstsCollectionUrl ) ;
69
+ client . DefaultRequestHeaders . Accept . Clear ( ) ;
70
+ client . DefaultRequestHeaders . Accept . Add ( new System . Net . Http . Headers . MediaTypeWithQualityHeaderValue ( "application/json" ) ) ;
71
+ client . DefaultRequestHeaders . Add ( "User-Agent" , "VstsRestApiSamples" ) ;
72
+ client . DefaultRequestHeaders . Add ( "X-TFS-FedAuthRedirect" , "Suppress" ) ;
73
+ client . DefaultRequestHeaders . Authorization = authHeader ;
74
+
75
+ // connect to the REST endpoint
76
+ HttpResponseMessage response = client . GetAsync ( "_apis/projects?stateFilter=All&api-version=2.2" ) . Result ;
77
+
78
+ // check to see if we have a succesfull respond
79
+ if ( response . IsSuccessStatusCode )
80
+ {
81
+ Console . WriteLine ( "\t Succesful REST call" ) ;
82
+ Console . WriteLine ( response . Content . ReadAsStringAsync ( ) . Result ) ;
83
+ }
84
+ else if ( response . StatusCode == System . Net . HttpStatusCode . Unauthorized )
85
85
{
86
- result = GetTokenViaCode ( ctx ) ;
86
+ throw new UnauthorizedAccessException ( ) ;
87
87
}
88
88
else
89
89
{
90
- Console . ForegroundColor = ConsoleColor . Red ;
91
- Console . WriteLine ( "Something went wrong." ) ;
92
- Console . WriteLine ( "Message: " + exc . InnerException . Message + "\n " ) ;
90
+ Console . WriteLine ( "{0}:{1}" , response . StatusCode , response . ReasonPhrase ) ;
93
91
}
94
92
}
95
- return result ;
96
- }
97
-
98
- static AuthenticationResult GetTokenViaCode ( AuthenticationContext ctx )
99
- {
100
- AuthenticationResult result = null ;
101
- try
102
- {
103
- DeviceCodeResult codeResult = ctx . AcquireDeviceCodeAsync ( resource_vsts , clientId_vs ) . Result ;
104
- Console . ResetColor ( ) ;
105
- Console . WriteLine ( "You need to sign in." ) ;
106
- Console . WriteLine ( "Message: " + codeResult . Message + "\n " ) ;
107
- result = ctx . AcquireTokenByDeviceCodeAsync ( codeResult ) . Result ;
108
- }
109
- catch ( Exception exc )
110
- {
111
- Console . ForegroundColor = ConsoleColor . Red ;
112
- Console . WriteLine ( "Something went wrong." ) ;
113
- Console . WriteLine ( "Message: " + exc . Message + "\n " ) ;
114
- }
115
- return result ;
116
93
}
117
94
}
118
95
}
0 commit comments