asp.net WebAPI에서 프론트 엔드 및 백엔드 API로 각도가있는 프로젝트에서 작업하고 있습니다. 호스트 된 OpenId 연결 서버 (mitreid)가 있으며이 서버를 인증 및 권한 부여에 사용해야합니다. 내가 그물 WebAPI에 오픈 ID Connect 서버 인증을 구성하려고mitreId openid 서버가 각도와 .net webapi 응용 프로그램을 사용하여 연결
는 이것은 내가 아래
처럼, 심지어 구성을 설정하려고 내가 WebAPIapp.SetDefaultSignInAsAuthenticationType("OpenIdConnect");
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = "some_client",
ClientSecret = "some_secret",
Authority = "http://localhost:8181/openid-connect-server-webapp",
UseTokenLifetime = true,
ResponseType = "code",
Scope = "openid email",
SignInAsAuthenticationType = "OpenIdConnect",
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false
},
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthorizationCodeReceived = (context) =>
{
var code = context.Code;
return Task.FromResult(0);
},
RedirectToIdentityProvider = async n =>
{
n.ProtocolMessage.RedirectUri = "http://localhost:54464/";
n.OwinContext.Authentication.Challenge(new String[] { "OpenIdConnect" });
},
SecurityTokenValidated = (n) =>
{
var nid = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType, "user", "user");
nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));
nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));
nid.AddClaim(new Claim("app_specific", "some data"));
n.AuthenticationTicket = new AuthenticationTicket(nid, n.AuthenticationTicket.Properties);
return Task.FromResult(0);
},
SecurityTokenReceived = (context) =>
{
var code = context;
return Task.FromResult(0);
},
AuthenticationFailed = (context) =>
{
//some redirect
context.HandleResponse();
return Task.FromResult(0);
}
}
});
의 StartUp.cs에 한 일이다
ConfigurationManager =
new ConfigurationManager<OpenIdConnectConfiguration>
("http://localhost:8181/openid-connect-server-webapp/.well-known/openid-configuration"),
Configuration = new OpenIdConnectConfiguration
{
Issuer = "http://localhost:8181/openid-connect-server-webapp",
AuthorizationEndpoint = "http://localhost:8181/openid-connect-server-webapp/authorize",
TokenEndpoint = "http://localhost:8181/openid-connect-server-webapp/token",
UserInfoEndpoint = "http://localhost:8181/openid-connect-server-webapp/userinfo"
},
API (포트 54464)를 디버깅하려고 할 때 컨트롤러에 권한 부여 attr을 추가하면 OpenID 로그인 페이지로 리디렉션되고 로그인이 성공한 후 컨트롤러 작업이 실행되지 않습니다. 이것이 첫 번째 호출 API에 대해 처음에 http://localhost:54464/api/common/getlist
을 테스트하는 API 호출이라고 가정하고 JSON 배열을 반환하는 대신 http://localhost:54464/api/common/getlist/?code=V7KFPZ&state=OpenIdConnect.AuthenticationProperties%3D****somecode****
으로 리디렉션합니다.
성공한 우편 배달부에서 위의 리디렉션 된 URL의 코드를 사용하여 무기명 토큰을 생성하려고했습니다. 그러나 우편함을 사용하여 권한 헤더에서 토큰을 사용하려고하면 응답은 OpenID 로그인 HTML 페이지입니다.
알림 이벤트의 문제 없음은 내가 뭔가를 누락 알고 RedirectToIdentityProvider
이외의 실행되어, 나는 이것에 비교적 새로운 해요, 나에게 사람들을 가리 킵니다하시기 바랍니다. 내가 뭔가 잘못하고 있거나, 구성상의 실수를 저 지르거나, OpenId 클라이언트를 구현하는 어떤 솔루션을 사용하고 있는지 알려주십시오.
인증 코드 흐름을 사용하고 있습니다. Angular 응용 프로그램은 독립 실행 형 SPA이고 WebAPI 응용 프로그램과 동일한 호스트 이름 및 포트로 호스팅되지 않습니다. 이와 같은 시나리오에는 암시 적 플로우가 있습니다. Angular 애플리케이션은 로그인 자체를 처리하고 ID 및 액세스 토큰을 얻습니다. 그런 다음 액세스 토큰을 API로 보내 자원을 확보합니다. 나는 클라이언트 라이브러리로'oidc-client' (NPM)를 사용하고 api에는'IdentityServer3.AccessTokenValidation' (NuGet)을 사용합니다. 이 방향으로 가고 싶다면 알려주세요. 그러면 대답을 드릴 것입니다. – mode777
네,이 접근법에 대한 통찰력을 제공해 주시겠습니까? – NikhilGoud