Я следующие OpenId варианты:маркер доступа является недействительным для сервера идентификации клиента
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
AuthenticationType = "oidc",
SignInAsAuthenticationType = "Cookies",
Authority = "http://localhost:5000",
ClientId = "mvcClient",
ClientSecret = "secret",
RedirectUri = "http://localhost:5002/signin-oidc",
PostLogoutRedirectUri = "http://localhost:5002",
ResponseType = "code id_token",
Scope = "openid profile",
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async n =>
{
var claims_to_exclude = new[]
{
"aud", "iss", "nbf", "exp", "nonce", "iat", "at_hash"
};
var claims_to_keep =
n.AuthenticationTicket.Identity.Claims
.Where(x => false == claims_to_exclude.Contains(x.Type)).ToList();
claims_to_keep.Add(new Claim("id_token", n.ProtocolMessage.IdToken));
if (n.ProtocolMessage.AccessToken != null)
{
claims_to_keep.Add(new Claim("access_token", n.ProtocolMessage.AccessToken));
}
}
}
}
Я вижу n.ProtocolMessage.AccessToken всегда нуль.
Я настроил клиента в сервере личных данных, как это:
new Client()
{
ClientId = "mvcClient",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
ClientSecrets = new List<Secret>()
{
new Secret("secret".Sha256())
},
// RequireConsent = false,
// where to redirect to after login
RedirectUris = { "http://localhost:5002/signin-oidc" },
// where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:5002" },
AllowedScopes =
{
StandardScopes.OpenId.Name,
StandardScopes.Profile.Name,
StandardScopes.OfflineAccess.Name,
StandardScopes.Roles.Name,
"API"
}
},
Я хочу знать, почему n.ProtocolMessage.AccessToken равно нулю, и как я могу получить его значение
UPDATE
Если я изменю тип клиента на гибрид следующим образом:
AllowedGrantTypes = GrantTypes.Hybrid,
и ResponseType = «Код id_token маркер:
Я получаю invalid_request ошибки на сервере
Если я пытаюсь получить маркер доступа, как это (в уведомлениях):
var client = new TokenClient("http://localhost:5000/connect/token", "mvcClient", "secret");
var response = client.RequestClientCredentialsAsync("testscope").Result;
var accesstoken = response.AccessToken;
claims_to_keep.Add(new Claim("access_token", accesstoken));
Результат лексемы имеет только одну область (т.е. testcope), а не все другие области, определенные для этого клиента.
как только я добавить «маркер» в типе ответа, он говорит unauthorize_client, я также изменил конфигурацию клиента GranTypes.Hybrid на сервере –
Да, вы должны позволить клиенту использовать этот поток (гибрид) как корректно. Обновлено. –
Я пробовал это, но он не работал. Я также обновил этот вопрос. –