1 // Copyright (c) .NET Foundation. All rights reserved.
2 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3 
4 using IdentityServer4.Models;
5 using System;
6 using System.Collections.Generic;
7 using System.Collections.ObjectModel;
8 
9 namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer
10 {
11     /// <summary>
12     /// A collection of <see cref="IdentityResource"/>.
13     /// </summary>
14     public class IdentityResourceCollection : Collection<IdentityResource>
15     {
16         /// <summary>
17         /// Initializes a new instance of <see cref="IdentityResourceCollection"/>.
18         /// </summary>
IdentityResourceCollection()19         public IdentityResourceCollection()
20         {
21         }
22 
23         /// <summary>
24         /// Initializes a new instance of <see cref="IdentityResourceCollection"/> with the given
25         /// identity resources in <paramref name="list"/>.
26         /// </summary>
27         /// <param name="list">The initial list of <see cref="IdentityResource"/>.</param>
IdentityResourceCollection(IList<IdentityResource> list)28         public IdentityResourceCollection(IList<IdentityResource> list) : base(list)
29         {
30         }
31 
32         /// <summary>
33         /// Gets an identity resource given its name.
34         /// </summary>
35         /// <param name="key">The name of the <see cref="IdentityResource"/>.</param>
36         /// <returns>The <see cref="IdentityResource"/>.</returns>
37         public IdentityResource this[string key]
38         {
39             get
40             {
41                 for (int i = 0; i < Items.Count; i++)
42                 {
43                     var candidate = Items[i];
44                     if (string.Equals(candidate.Name, key, StringComparison.Ordinal))
45                     {
46                         return candidate;
47                     }
48                 }
49 
50                 throw new InvalidOperationException($"IdentityResource '{key}' not found.");
51             }
52         }
53 
54         /// <summary>
55         /// Adds the identity resources in <paramref name="identityResources"/> to the collection.
56         /// </summary>
57         /// <param name="identityResources">The list of <see cref="IdentityResource"/> to add.</param>
AddRange(IEnumerable<IdentityResource> identityResources)58         public void AddRange(IEnumerable<IdentityResource> identityResources)
59         {
60             foreach (var resource in identityResources)
61             {
62                 Add(resource);
63             }
64         }
65 
66         /// <summary>
67         /// Adds the identity resources in <paramref name="identityResources"/> to the collection.
68         /// </summary>
69         /// <param name="identityResources">The list of <see cref="IdentityResource"/> to add.</param>
AddRange(params IdentityResource[] identityResources)70         public void AddRange(params IdentityResource[] identityResources)
71         {
72             foreach (var resource in identityResources)
73             {
74                 Add(resource);
75             }
76         }
77 
78         /// <summary>
79         /// Adds an openid resource.
80         /// </summary>
AddOpenId()81         public void AddOpenId() =>
82             Add(IdentityResourceBuilder.OpenId().Build());
83 
84         /// <summary>
85         /// Adds an openid resource.
86         /// </summary>
87         /// <param name="configure">The <see cref="Action{IdentityResourceBuilder}"/> to configure the openid scope.</param>
AddOpenId(Action<IdentityResourceBuilder> configure)88         public void AddOpenId(Action<IdentityResourceBuilder> configure)
89         {
90             var resource = IdentityResourceBuilder.OpenId();
91             configure(resource);
92             Add(resource.Build());
93         }
94 
95         /// <summary>
96         /// Adds a profile resource.
97         /// </summary>
AddProfile()98         public void AddProfile() =>
99             Add(IdentityResourceBuilder.Profile().Build());
100 
101         /// <summary>
102         /// Adds a profile resource.
103         /// </summary>
104         /// <param name="configure">The <see cref="Action{IdentityResourceBuilder}"/> to configure the profile scope.</param>
AddProfile(Action<IdentityResourceBuilder> configure)105         public void AddProfile(Action<IdentityResourceBuilder> configure)
106         {
107             var resource = IdentityResourceBuilder.Profile();
108             configure(resource);
109             Add(resource.Build());
110         }
111 
112         /// <summary>
113         /// Adds an address resource.
114         /// </summary>
AddAddress()115         public void AddAddress() =>
116             Add(IdentityResourceBuilder.Address().Build());
117 
118         /// <summary>
119         /// Adds an address resource.
120         /// </summary>
121         /// <param name="configure">The <see cref="Action{IdentityResourceBuilder}"/> to configure the address scope.</param>
AddAddress(Action<IdentityResourceBuilder> configure)122         public void AddAddress(Action<IdentityResourceBuilder> configure)
123         {
124             var resource = IdentityResourceBuilder.Address();
125             configure(resource);
126             Add(resource.Build());
127         }
128 
129         /// <summary>
130         /// Adds an email resource.
131         /// </summary>
AddEmail()132         public void AddEmail() =>
133             Add(IdentityResourceBuilder.Email().Build());
134 
135         /// <summary>
136         /// Adds an email resource.
137         /// </summary>
138         /// <param name="configure">The <see cref="Action{IdentityResourceBuilder}"/> to configure the email scope.</param>
AddEmail(Action<IdentityResourceBuilder> configure)139         public void AddEmail(Action<IdentityResourceBuilder> configure)
140         {
141             var resource = IdentityResourceBuilder.Email();
142             configure(resource);
143             Add(resource.Build());
144         }
145 
146         /// <summary>
147         /// Adds a phone resource.
148         /// </summary>
AddPhone()149         public void AddPhone() =>
150             Add(IdentityResourceBuilder.Phone().Build());
151 
152         /// <summary>
153         /// Adds a phone resource.
154         /// </summary>
155         /// <param name="configure">The <see cref="Action{IdentityResourceBuilder}"/> to configure the phone scope.</param>
AddPhone(Action<IdentityResourceBuilder> configure)156         public void AddPhone(Action<IdentityResourceBuilder> configure)
157         {
158             var resource = IdentityResourceBuilder.Phone();
159             configure(resource);
160             Add(resource.Build());
161         }
162     }
163 }
164