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