2017-12-05 15 views
0

MVC 및 API 컨트롤러가 병렬로 사용되는 프로젝트에서 작업하고 있습니다. API 컨트롤러에서 MVC 컨트롤러 및 토큰 기반 인증에 쿠키 기반 인증을 사용할 수 있습니까? 그것을 성취하는 방법?한 프로젝트에서 쿠키 및 토큰 기반 인증 paralelly 사용

문제는 - Startup.auth (아래)를 작성하고 [Authorize] 특성을 사용할 때 - 웹 API가 호출되는 동안 예상 한대로 작동하지 않기 때문에 쿠키를 확인하고 메소드를 실행할 수 있기 때문에 문제가됩니다. 토큰없이.

public partial class Startup 
{ 
    private string PublicClientId { get; set; } 
    private OAuthAuthorizationServerOptions OAuthOptions { get; set; } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.CreatePerOwinContext(DatabaseContext.Create); 
     app.CreatePerOwinContext<MobileUserManager>(MobileUserManager.Create); 
     app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/AuthServices/SignIn"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<MobileUserManager, UserEntity, int>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager), 
        getUserIdCallback: (id) => (id.GetUserId<int>())) 
      } 
     }); 

     PublicClientId = "self"; 
     OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(180), 
      Provider = new ApplicationOAuthProvider(PublicClientId), 
      RefreshTokenProvider = new ApplicationRefreshTokenProvider() 
     }; 
     app.UseOAuthBearerTokens(OAuthOptions); 
    } 
} 

답변

0
당신은 권한 부여 특성을 무시하고 현재이며, 어떤이 (단지 의사 코드)처럼 요구되는 인증의 유형을 확인하기 위해 시도 할 수

:

public class AuthorizeAttribute : AuthorizeAttribute 
{ 
    private bool IsCookieAuthAllowed { get; } 

    public ApolloAuthorizeAttribute(bool isCookieAuthAllowed = false) 
    { 
     IsCookieAuthAllowed = isCookieAuthAllowed; 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var identity = actionContext.ControllerContext.RequestContext.Principal?.Identity; 

     if (identity == null) 
      return false; 

     if (identity.IsCookie()) 
      return IsCookieAuthAllowed && identity.IsAuthenticated; 

     return base.IsAuthorized(actionContext); 
    } 
}