2016-07-08 2 views
1

3 계층 응용 프로그램 구조가 있습니다. 최종 사용자를위한 cordova js 응용 프로그램, OpenID 기관 역할을하는 identityserver3 구현 및 cordova 응용 프로그램의 인앱 브라우저를 통해 액세스 할 수있는 MVC 응용 프로그램이 있습니다.무기 토큰을 MVC 앱용 인증 쿠키로 변환하는 방법

사용자의 시작 진입 점은 코드바 앱입니다. 인앱 브라우저를 통해 로그인하면 애플리케이션 기능에 액세스하거나 링크를 클릭하여 인앱 브라우저를 열고 MVC 앱을 방문 할 수 있습니다.

MVC의 웹 사이트를 보호하기위한 우리의 전략은 우리가 이미 응용 프로그램에서 한 번 로그인하고이 MVC 응용 프로그램에 지시했을 때 다시 로그인하라는 메시지를 표시하지 않았기 때문에, 토큰 인증 베어러 사용하는 것이 었습니다

:

를 쿼리 문자열에 access_token이를 지속하는 것은 고통스러운 때문에
app.Map("/account", account => 
{ 
    account.UseIdentityServerBearerTokenAuthentication(new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions() 
    { 
     Authority = "https://localhost:44333/core", 
     RequiredScopes = new string[] { "scope" }, 
     DelayLoadMetadata = true, 
     TokenProvider = new QueryStringOAuthBearerProvider(), 
     ValidationMode = ValidationMode.ValidationEndpoint, 
    }); 
} 

, 나는 사용자 정의 OAuthBearerAuthenticationProvider 구현이 작동

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider 
{ 
    private static ILog logger = LogManager.GetLogger(typeof(QueryStringOAuthBearerProvider)); 
    public override Task RequestToken(OAuthRequestTokenContext context) 
    { 
     logger.Debug($"Searching for query-string bearer token for authorization on request {context.Request.Path}"); 

     string value = GetAccessTokenFromQueryString(context.Request); 

     if (!string.IsNullOrEmpty(value)) 
     { 
      context.Token = value; 
      //Save the token as a cookie so the URLs doesn't need to continue passing the access_token 
      SaveAccessTokenToCookie(context.Request, context.Response, value); 
     } 
     else 
     { 
      //Check for the cookie 
      value = GetAccessTokenFromCookie(context.Request); 
      if (!string.IsNullOrEmpty(value)) 
      { 
       context.Token = value; 
      } 
     } 

     return Task.FromResult<object>(null); 
    } 
    [cookie access methods not very interesting] 
} 

을, 모든 요청에 ​​액세스 토큰을 유지하지하기 위해 MVC 응용 프로그램을 허용하지만, 에스 일반 쿠키로만 액세스 토큰을 추적하는 것은 잘못된 것처럼 보입니다.

내가 대신하고 싶은 것은 액세스 토큰을 사용하여 OpenID 끝점을 사용하고 로그 아웃에 응답하는 양식 인증 스타일 쿠키를 발행하는 것입니다. account.UseOpenIdConnectAuthentication(..)을 추가 할 수 있지만 access_token을 통해 인증하면 OpenIdConnectAuthentication 비트는 건너 뜁니다. 어떤 아이디어?

답변

2

액세스 토큰은 웹 api를 호출하는 데 사용하도록 설계되었습니다. OIDC의 id_token을 사용하여 사용자를 인증하고 내부의 클레임에서 로컬 인증 쿠키를 발급합니다. Microsoft OpenIdConnect 인증 미들웨어는 이러한 어려운 작업을 대부분 처리합니다.

+0

어딘가에 내가 그 논리를 주입 할 수있는 고리가 있습니까? BearerTokenAuth 비트에는 콜백이 없으며 "UseOpenIdConnectAuthentication"에 제공된 알림이 적절하지 않은 것처럼 보입니다. 아마도 인증 필터 속성일까요? – K0D4

+0

UseOpenIdConnectAuthentication MW가 쿠키를 발행합니다. 쿠키에서 발행 된 클레임을 변경해야하는 경우 SecurityTokenValidated 이벤트를 처리하십시오. –

+0

설명을 해주셔서 감사합니다. Brock, 올바르게 이해하면 Bearer auth config를 완전히 제거하고 UseOpenIDConnectAuthentication으로 바꿔야합니다. 거기에서 쿼리 문자열을보고 토큰을 꺼내 OIDC로 권한을 부여하고 ClaimsIdentity를 처리하고 인증 티켓을 설정합니다. 양자 택일로, 나는 두 가지 인증 것들을 거기에 보관한다면, 나는 그들을 묶는 방법이 필요 하겠지만, 내가 BearerToken을 가지고있을 때, 다른 인증 루틴은 완전히 건너 뛴다. – K0D4

관련 문제