2014-04-09 2 views
1

두 부분으로 된 응용 프로그램을 만들고 있습니다. 한 서버에는 Owin을 사용하는 .net Webapi2가 있습니다. 다른 서버에는 현재 API가없는 프런트 엔드 역할을하는 로그인이없는 MVC5 웹 사이트가 있습니다. 앱 자체가 동일한 API를 사용하기 때문에 클라이언트가 개발할 수있는 것의 예라고 보여주는 것도 좋은 판매 포인트 일 것입니다. API를 사용하여 자체 프론트 엔드 앱을 개발할 수 있도록 제 3자를 필요로하기 때문에 API에 사용자 인증 항목을 넣었습니다.이 MVC5 클라이언트를 원격 WebApi2 앱을 통해 로그인하려면 어떻게해야합니까?

나는 사용자가 프론트 엔드에 자신의 로그인 정보를 제출이 필요합니다 내가 (이론적으로) 달성하기 위해 노력하고있어 그것은 resourceownergrant 유형을 통해이를 인증하고 프런트 엔드 만들 수 있도록 결과를받을 것이다 accesstoken과 identityuser/roles를 포함하는 쿠키. 이 쿠키가 존재하는 한 mvc 응용 프로그램은 accesstoken을 사용하여 API를 호출합니다. MVC 앱과 API는 모두 [Authorize] 속성을 사용할 수 있습니다. 내가 가진 무엇

지금까지 는 내가 API를 위로 가지고 작업, 나는 "grant_type = 비밀번호 & 이름 = testuser를 & 암호 = password123"를 게시 할 수 있습니다 내가 JSON이 뭔가를받을

{ 
    "access_token":"-longasstokenhere-", 
    "token_type":"bearer", 
    "expires_in":1209599, 
    "userName":"testuser", 
    ".issued":"Thu, 03 Apr 2014 16:21:06 GMT", 
    ".expires":"Thu, 17 Apr 2014 16:21:06 GMT" 
} 

웹 API의 반응은 내 질문에 내 MVC 응용 프로그램을 연결하는 방법입니다

set-cookie: -Long-assserializedcookiestuffhere- 

의 헤더가 있습니다. 내 mvc5 응용 프로그램에서

나는

app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
       CookieName = "MyCookie", 
       LoginPath = new PathString("/Account/Login") 
      }); 

가 [권한 부여]가 내가 방문했을 때, 제대로 리디렉션하는 테스트 페이지에서 설정 한 속성 내가 한 configureauth이 세트로 owin의 시작있어 나 로그인 페이지. 제가 누락 된 부분은 로그인을 클릭하면 웹 사이트 게시물이 API로 돌아가고 웹 사이트에서 사용자가 [승인] 속성을 통과 할 수있게하는 Owin 쿠키를 만드는 방법입니다. 나는 또한 iduser를 포함하고 싶다. 그래서 웹 애플리케이션은 모든 호출에 대해 API에 다시 게시하지 않고도 사용자 정보를 자동으로 가질 것이다. 어떻게 든 반환 결과에서 쿠키를 가져올 수 있는지 모르겠다.

또한 더 좋은 방법은 제안에 대한 것입니다.

Heeelp !?

답변

2

나는 똑같은 요구 사항을 가지고있었습니다. MVC5 CookieAuthentication을 작동 시키려고했지만 자체 쿠키 값을 사용할 수 없습니다. 그러나 WebAPI는 set-cookie를 반환해서는 안됩니다. WebAPI는 RESTful이어야하며 클라이언트가 모든 요청에 ​​대해 베어러 토큰을 전달해야합니다.

내 솔루션은 다음과 같습니다. 사용자 이름과 비밀번호는 JSON 웹 토큰을 반환하는 외부 API로 전송됩니다. API의 토큰은 쿠키에 저장됩니다. 자바 스크립트 나 MVC 계정 컨트롤러에서 그렇게 할 수 있습니다. 이 쿠키는 MVC 응용 프로그램에 의해 검사되며, 쿠키가 있으면 사용자가 MVC 응용 프로그램에 로그인했다는 증거도 표시됩니다.

JavaScript에서는 쿠키에서 해당 토큰을 가져와 인증 헤더의 무기명 토큰으로 API에 대한 모든 요청에 ​​추가합니다. 또한 MVC 앱은 쿠키 (토큰) 값을 사용하여 사용자의 모든 주장에 액세스 할 수 있습니다. 로그 아웃하려면 쿠키가 만료됩니다.베어러 토큰이 아니라 표준, 쿠키에 저장되기 때문에

첫째, 와이어까지 응용 프로그램은, 나는 사용자 지정 공급자를 사용했다, 이제 우리의 사용자 지정 공급자

// Api controllers with an [Authorize] attribute will be validated with JWT 
app.UseJwtBearerAuthentication(
    new JwtBearerAuthenticationOptions 
    { 
     AllowedAudiences = audienceId.ToArray(), 
     IssuerSecurityTokenProviders = providers.ToArray(), 
     Provider = new CookieOAuthBearerProvider("MyCookieName") 
     { 
      LoginPath = new PathString("/Account/Login") 
     } 
    } 
); 

으로, 무기명 토큰을 사용하는 머리글. 나는 또한 당신이 단순히 말해서 주장을 얻을 수 있습니다, 단순히 MVC 응용 프로그램에서 401

public class CookieOAuthBearerProvider : IOAuthBearerAuthenticationProvider 
{ 
    public PathString LoginPath {get; set;} 

    public string CookieName { get; set; } 

    public CookieOAuthBearerProvider(string cookieName) 
    { 
     if(string.IsNullOrWhiteSpace(cookieName)) { 
      throw new ArgumentNullException("cookieName"); 
     } 
     else { 
      this.CookieName = cookieName; 
     }; 
    } 

    public Task ApplyChallenge(OAuthChallengeContext context) 
    { 
     if (this.LoginPath.HasValue) 
     { 
      context.Response.Redirect(this.LoginPath.Value); 
     } 
     return Task.FromResult<object>(null); 
    } 

    public Task RequestToken(OAuthRequestTokenContext context) 
    { 
     string token = context.Request.Cookies[this.CookieName]; 
     if (!string.IsNullOrEmpty(token)) 
     { 
      context.Token = token; 
     } 
     return Task.FromResult<object>(null); 
    } 

    public Task ValidateIdentity(OAuthValidateIdentityContext context) 
    { 
     // prove that the cookie token matches this site using context.Ticket.Identity 
     return Task.FromResult<object>(null); 
    } 
} 

그런 다음, 다른 곳에서는 발행하지 않고 있음을, 로그인 페이지로 리디렉션해야합니다

ClaimsPrincipal.Current 
+0

이봐, 메신저 귀하의 구현을 사용하려고하면 JWT 토큰을 사용하여 메신저와 내가 각도에서 그것을 사용하여 헤더에서 토큰을 보낼 때 좋은 작동하지만 ... 내가보기에 때로는 전환 할 내 MVC가 필요해 그래서 나를 계속 쿠키가 필요했습니다 mvc에 로그인 ...하지만 심지어 코드와 함께, 난 아직도 컨트롤러에서 권한 부여를 통과 못해 ... JWT에서 권한 부여 특성에서 일어나는 일을 디버깅 할 수 있습니까? – Shakawkaw