Я использую OpenId Connect для аутентификации пользователя в одном из ASP. Net MVC приложений, над которыми я работаю. Я пытаюсь извлечь access_token в методе контроллера, чтобы сделать http-вызов с этим access_token в заголовке авторизации. Чтобы получить токен доступа, я преобразую свойство User.Identity в ClaimsIdentity, а затем пытаюсь найти конкретное утверждение, вызвав метод FindFirst, но он возвращает значение NULL. Требуемая конфигурация для OpenId Connect все в порядке и на месте.
Вот мой код для конфигурации OpenId в -
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
ClientId = clientId,
ClientSecret = clientSecret,
Authority = authority,
RedirectUri = redirectUri,
ResponseType = OpenIdConnectResponseType.CodeIdToken,
Scope = OpenIdConnectScope.OpenIdProfile,
PostLogoutRedirectUri = postLogoutRedirectUri,
Configuration = new OpenIdConnectConfiguration(configurationString),
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name"
},
SaveTokens = true,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async n =>
{
// Exchange code for access and ID tokens
var tokenClient = new TokenClient(tokenUri, clientId, clientSecret);
var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, redirectUri);
if (tokenResponse.IsError)
{
throw new Exception(tokenResponse.Error);
}
var userInfoClient = new UserInfoClient(userInfoUri);
var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);
var claims = new List<Claim>();
claims.AddRange(userInfoResponse.Claims);
claims.Add(new Claim("id_token", tokenResponse.IdentityToken));
claims.Add(new Claim("access_token", tokenResponse.AccessToken));
if (!string.IsNullOrEmpty(tokenResponse.RefreshToken))
{
claims.Add(new Claim("refresh_token", tokenResponse.RefreshToken));
}
n.AuthenticationTicket.Identity.AddClaims(claims);
return;
},
}
)};
}
Вот мой код метода Controller, где я я пытаюсь извлечь access_token
[Route("oauth/callback")]
[Authorize]
public ActionResult Callback()
{
var claimsIdentity = User.Identity as ClaimsIdentity;
// Extract tokens
string accessToken = claimsIdentity?.FindFirst(c => c.Type == "access_token")?.Value;
string idToken = claimsIdentity?.FindFirst(c => c.Type == "id_token")?.Value;
return RedirectToAction("Index", "User");
}
Две вещи здесь - 1. Когда вызывается этот метод, приложение перенаправляет на страницу входа, что означает, что атрибут Authorize не работает (я полагаю, что).
Без атрибута Authorize я могу отладить метод, но и accessToken, и idToken показывают нулевое значение при наведении на них указателя.
Пожалуйста, помогите. Любая помощь будет оценена.
Спасибо,
Амит Ананд