Ударяю меня об этом в течение нескольких дней.
Итак, у меня есть Identity Server 4, который является моей «аутентификацией в качестве службы», централизованным входом в систему для всех моих приложений с использованием ASP.NET Identity для управления пользователями.
На моей Клиентской стороне я использую Angular с oidc-client.js
, и пока все работает должным образом, я могу получить токен идентификации пользователя и токен доступа.
Для моего WebApi (без использования.NET Core), я пытаюсь использовать UseOpenIdConnectAuthentication
, чтобы я мог добавить через него специфические пользовательские утверждения приложения OpenIdConnectAuthenticationNotifications
, но при вызове моего API из Angular получаю 401 Unauthorized
.
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
ResponseType = "id_token token",
Scope = "openid profile api1",
Authority = "http://localhost:61294/",
ClientId = "api",
RedirectUri = "http://localhost:56105/sigin-oidc",
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async n =>
{
// Ignore, just testing
var tokenClient = new TokenClient("http://localhost:61294/connect/token", "mvc");
var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
},
SecurityTokenValidated = async n =>
{
var userInfoClient = new UserInfoClient(new Uri("http://localhost:61294/connect/userinfo"), n.ProtocolMessage.AccessToken);
var userInfo = await userInfoClient.GetAsync();
var nId = new ClaimsIdentity(
n.AuthenticationTicket.Identity.AuthenticationType,
ClaimTypes.GivenName,
ClaimTypes.Role);
userInfo.Claims.ToList().ForEach(c => nId.AddClaim(new Claim(c.Item1, c.Item2)));
nId.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
nId.AddClaim(new Claim("Test", "test"));
n.AuthenticationTicket = new AuthenticationTicket(nId, n.AuthenticationTicket.Properties);
n.Request.Headers.SetValues("Authorization ", "Bearer ", n.ProtocolMessage.AccessToken);
},
SecurityTokenReceived = async n =>
{
Debug.WriteLine(n);
}
}
});
Я такжеЯ использовал пакет IdentityServer3.AccessTokenValidation
и использую app.UseIdentityServerBearerTokenAuthentication
, который работает нормально, я смог успешно вызвать свой API, но я не вижу, как я могу применить свои пользовательские требования через это.
Я подхожу к этомунеправильный способ использования app.UseOpenIdConnectAuthentication
для веб-API?Любое руководство по этому вопросу будет высоко ценится.