Я прохожу учебник по IdentityServer 4, где объясняется, как добавить аутентификацию пользователя с OpenID Connect, его можно найти здесь:
http://docs.identityserver.io/en/latest/quickstarts/3_interactive_login.html
В основном в этом учебникеу нас есть приложение MVC с действием контроллера, украшенным атрибутом Authorized.Каждый раз, когда пользователь пытается получить доступ к этому действию, в случае, если он / она не вошел в систему, приложение MVC перенаправляет пользователя на Identity Server, чтобы он / она мог ввести учетные данные для входа.Если учетные данные верны, Identity Server перенаправляет обратно в приложение MVC, где отображается страница с учетными данными пользователя.Я завершил урок, и теперь я хочу исследовать немного больше, добавляя новые требования к токену, но пока не добился успеха.В учебном пособии области OpenId и Profile добавляются путем настройки AllowedScopes в конфигурации клиента.Я попытался создать «возрастную» область и добавить ее таким же образом, но это не сработало.У кого-нибудь есть идеи, как я могу это сделать?Код показан ниже (закомментированные строки - это то, что я уже пробовал).
Настройка IdentityServer:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}
В конфигурации хранилищ памяти:
public class Config
{
public static IEnumerable<Client> GetClients()
{
return new List<Client>()
{
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.Implicit,
// where to redirect to after login
RedirectUris = { "http://localhost:5002/signin-oidc" },
// where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
RequireConsent = false,
//AlwaysIncludeUserClaimsInIdToken = true,
//AlwaysSendClientClaims = true,
//AllowAccessTokensViaBrowser = true,
AllowedScopes = new List<string>
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"age"
}
}
};
}
public static List<TestUser> GetUsers()
{
return new List<TestUser>()
{
new TestUser()
{
SubjectId = "1",
Username = "alice",
Password = "password",
Claims = new List<Claim>()
{
new Claim("age", "15"),
new Claim("name", "Alice"),
new Claim("website", "https://alice.com")
}
},
new TestUser()
{
SubjectId = "2",
Username = "bob",
Password = "password",
Claims = new List<Claim>()
{
new Claim("age", "16"),
new Claim("name", "Bob"),
new Claim("website", "https://bob.com")
}
}
};
}
public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
new IdentityResource()
{
DisplayName = "Age",
Name = "age",
UserClaims = new List<string>()
{
"age"
}
}
};
}
}
Настройка приложения MVC:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddRazorViewEngine()
.AddAuthorization()
.AddJsonFormatters();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.SaveTokens = true;
});
}
Страница заявок на приложения MVC:
<dl>
@foreach (var claim in User.Claims)
{
<dt>@claim.Type</dt>
<dd>@claim.Value</dd>
}
</dl>
Это результат успешного входа в систему:
sid ba7ecb47f66524acce04e321b8d2c444
sub 2
idp local
name Bob
website https://bob.com
Как видите, в профиле отображаются претензии (имя и сайт), но пользовательские "возраст "претензий не имеет.