0

asp.net WebAPI에서 프론트 엔드 및 백엔드 API로 각도가있는 프로젝트에서 작업하고 있습니다. 호스트 된 OpenId 연결 서버 (mitreid)가 있으며이 서버를 인증 및 권한 부여에 사용해야합니다. 내가 그물 WebAPI에 오픈 ID Connect 서버 인증을 구성하려고mitreId openid 서버가 각도와 .net webapi 응용 프로그램을 사용하여 연결

는 이것은 내가 아래

처럼, 심지어 구성을 설정하려고 내가 WebAPI

app.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 클라이언트를 구현하는 어떤 솔루션을 사용하고 있는지 알려주십시오.

+0

인증 코드 흐름을 사용하고 있습니다. Angular 응용 프로그램은 독립 실행 형 SPA이고 WebAPI 응용 프로그램과 동일한 호스트 이름 및 포트로 호스팅되지 않습니다. 이와 같은 시나리오에는 암시 적 플로우가 있습니다. Angular 애플리케이션은 로그인 자체를 처리하고 ID 및 액세스 토큰을 얻습니다. 그런 다음 액세스 토큰을 API로 보내 자원을 확보합니다. 나는 클라이언트 라이브러리로'oidc-client' (NPM)를 사용하고 api에는'IdentityServer3.AccessTokenValidation' (NuGet)을 사용합니다. 이 방향으로 가고 싶다면 알려주세요. 그러면 대답을 드릴 것입니다. – mode777

+0

네,이 접근법에 대한 통찰력을 제공해 주시겠습니까? – NikhilGoud

답변

1

위의 설명에서 설명한 것처럼 Authorization Code 흐름은 Angular 응용 프로그램과 같은 Javascript 클라이언트에는 적합하지 않습니다.

인증 서버 (Mitreid) : 따라서 이것은 암시 적 흐름

이것은 당신이 인기있는 라이브러리로 접근 수있는 방법이다에 대한 가능한 설정에 대해 설명 Mitreid에 대한 나도 몰라 아무것도하지만, 당신은 ID가 some_client 인 클라이언트 응용 프로그램을 등록하거나 implict 플로우를 사용하도록 기존 클라이언트 구성을 변경하십시오. Identity Server와 같은 일부 구현에는 액세스 토큰을 브라우저에 전달할 수 있도록 추가 매개 변수가 필요합니다. 또한 http://YOUR_ANGULAR_APP/auth-callback을 리디렉션 URI로 등록해야합니다. 또한 액세스 토큰을 사용할 수 있도록 WebApi 응용 프로그램의 범위를 등록 할 수도 있습니다. webapi이라는 범위가 있다고 가정합니다. 또한 JWT를 사용하고 참조 토큰을 사용하지 않을 것이라고 가정합니다. 나중에 WebAPI 구성이 약간 다릅니다.

클라이언트 (각) : NPM을 통해 설치할 수있는 oidc-client 라이브러리를 사용하는 것이 좋습니다. 다음은 각도로 통합하는 방법을 안내합니다 : https://www.scottbrady91.com/Angular/SPA-Authentiction-using-OpenID-Connect-Angular-CLI-and-oidc-client. 나는 당신의 예에 따라 설정을 업데이트 :

export function getClientSettings(): UserManagerSettings { 
    return { 
     authority: 'http://localhost:8181/openid-connect-server-webapp', 
     client_id: 'some_client', 
     redirect_uri: 'http://YOUR_ANGULAR_APP/auth-callback', 
     post_logout_redirect_uri: 'http://YOUR_ANGULAR_APP/', 
     response_type:"id_token token", 
     scope:"openid email webapi", 
     filterProtocolClaims: true, 
     loadUserInfo: true 
    }; 
} 

각 응용 프로그램은 모든 것이 제대로 일 경우 ID 토큰 및 액세스 토큰 당신을 남긴다 로그인 절차를 시작합니다. oidc-client은 WebAPI 앱에 대한 모든 승인 된 요청에 추가해야하는 액세스 토큰과 함께 Authorization 헤더를 준비합니다. oidc-client은 자동으로 사용자 소유권 주장을로드합니다.

자원 서버 (WebAPI 앱) : 당신은 그냥 액세스 토큰 검증 미들웨어 및 [Authorize] 속성을 추가 할 필요가 같이 WebAPI 측 구현은 매우 간단합니다. pre -ASP.NET 핵심 애플리케이션의 경우 Nuget을 통해 설치할 수있는 IdentityServer3.AccessTokenValidation을 사용하고 싶습니다. 당신이 당신의 WebAPI에 [Authorize] 엔드 포인트를 추가하는 경우

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
     { 
      Authority = "http://localhost:8181/openid-connect-server-webapp", 
      RequiredScopes = "openid email webapi" 
     }); 

당신은 JWT에 포함 된 주장을 기반으로 ClaimsIdentityUser로를 얻어야한다.

+0

나는 이것을 시도하고 돌아올 것이다. openId 서버가 토큰 응답 유형을 구현하지 못했습니다. 그래서 토큰의 유효성을 수동으로 확인해야합니다. – NikhilGoud

관련 문제