2012-10-22 4 views
13

면책 조항 : MVC4 + Web API + 웹 서비스를 처음 사용한다고 말하면서부터 시작하겠습니다. + JQuery. 나는 이것을 잘못된 각도로 공격했을 수도 있습니다.ASP.NET 웹 API의 기본 및 폼 인증

저는 .NET 용 C#에서 Web MVC App + Web API를 Azure에 배포하려고합니다. 웹 API는 모바일 클라이언트 (iOS, RestKit 사용)에서 사용됩니다.

웹 MVC 응용 프로그램은 비교적 간단합니다. 우리는 그것을위한 양식 인증과 SimpleMembership을 사용하고자합니다.

우리는 JQuery (Knockout) 스크립트의 웹 API 메소드를 사용하여 웹 페이지를 채 웁니다. 따라서 JQuery는 폼 인증으로 인증 된 동일한 ID를 사용하기를 기대합니다.

그러나 Web Api는 모바일 클라이언트에서 직접 호출 할 수 있습니다. 해당 양식에 대한 양식 인증이 없습니다.

Thinktecture Identity Model (http://nuget.org/packages/Thinktecture.IdentityModelhttps://github.com/thinktecture/Thinktecture.IdentityModel.40)을 살펴 보았습니다. BasicAuth 및 AcessKey 처리기를 config에 추가하고 작동합니다 (아래 코드 참조).

인증되지 않고 webapi에 액세스하려고하면 브라우저가 기본 인증 대화 상자를 표시하고 예상대로 작동합니다.

"문제"는 이미 폼 인증을 통해 로그인하고 웹 API 메서드를 호출하려고해도 여전히 기본 인증 대화 상자가 표시된다는 것입니다. 다시 말해, Thinktecture IdentityModel은 폼 인증을 모두 무시하는 것처럼 보입니다.

내 질문은 :

  1. 내 기대가 정확합니까? 일단 양식 인증을 수행하면 JQuery 스크립트 등이 동일한 브라우저 사용자 세션에서 웹 API에 액세스 할 수있게해야합니다.
  2. 어떻게 수정합니까?
  3. 내 기대가 정확하지 않은 경우; 이게 어떻게 작동할까요? 예 : JQuery 스크립트를 인증하려면 어떻게해야합니까?

Stackoverflow에는 비슷한 질문이 많이 있습니다. 솔직히 많은 것을 보았습니다. 동영상 등을 보았지만, 뭔가 분명한 것을 놓치고 있거나 새로운 것에 대해 명확한 문서가 없습니다. 기술.

감사합니다. 감사.

public static AuthenticationConfiguration CreateConfiguration() 
{ 
var config = new AuthenticationConfiguration 
     { 
      DefaultAuthenticationScheme = "Basic", 
      EnableSessionToken = true, 
      SetNoRedirectMarker = true 
     };    

config.AddBasicAuthentication((userName, password) => userName == password, retainPassword: false); 
config.AddAccessKey(token => 
     { 
      if (ObfuscatingComparer.IsEqual(token, "accesskey123")) 
      { 
       return Principal.Create("Custom", 
        new Claim("customerid", "123"), 
        new Claim("email", "[email protected]")); 
      } 

      return null; 
     }, AuthenticationOptions.ForQueryString("key")); 

답변

6

다음은 이전에 제기 한이 문제에 대한 해결책입니다.

참고 : Thinktecture 신원 모델을 포함하지 않는이 솔루션.

나는 추상화 처리자 인 BasicAuthenticationHandler 클래스를 가지고 있습니다. 최신 안정 장치 WebAPIDoodle NuGet package을 설치하여이 핸들러를 얻을 수 있습니다.

이 기본 기본 인증 처리기에 힌트를 제공하여 요청이 이미 인증 된 경우 (예 : 양식 auth) 인증 프로세스를 억제 할 수 있습니다.당신이 등록 할 필요가 귀하의 사용자 정의 핸들러는 아래와 같을 것이다 :

public class MyApplicationAuthHandler : BasicAuthenticationHandler { 

    public MyApplicationAuthHandler() 
     : base(suppressIfAlreadyAuthenticated: true) { } 

    protected override IPrincipal AuthenticateUser(
     HttpRequestMessage request, 
     string username, 
     string password, 
     CancellationToken cancellationToken) { 

     //this method will be called only if the request 
     //is not authanticated. 

     //If you are using forms auth, this won't be called 
     //as you will be authed by the forms auth bofore you hit here 
     //and Thread.CurrentPrincipal would be populated. 

     //If you aren't authed: 
     //Do you auth here and send back an IPrincipal 
     //instance as I do below. 

     var membershipService = (IMembershipService)request 
      .GetDependencyScope() 
      .GetService(typeof(IMembershipService)); 

     var validUserCtx = membershipService 
      .ValidateUser(username, password); 

     return validUserCtx.Principal; 
    } 

    protected override void HandleUnauthenticatedRequest(UnauthenticatedRequestContext context) { 

     // Do nothing here. The Autharization 
     // will be handled by the AuthorizeAttribute. 
    } 
} 

을 마지막 단계로, 당신은 특정 역할에 대한 권한을 부여하기 위해 컨트롤러와 액션 메소드에 System.Web.Http.AuthorizeAttribute (안 System.Web.Mvc.AuthorizeAttribute)을 적용해야 할 것이다 사용자.

귀하의 문제를 해결하는 데 도움이되기를 바랍니다.

+0

안녕하세요, 좋습니다. 그러나 "IMembershipService"인터페이스의 출처는 어디입니까? (WebAPIDoongle 또는 표준 .NET4 MVC의 일부로 보이지 않음). 클래스가 작동하지만 동일한 클래스에서 API 키를 처리하기를 바랍니다. 그러나 해당 기능을 추가 할 수 있다고 생각합니다. 내 주요 문제는 지금은 "WebSecurity"클래스를 사용하여 데이터베이스에 대해 사용자의 유효성을 검사하고 주체를 반환하는 방법입니다 (WebSecurity.Login을 수행 할 수는 있지만 그 방법은 어렵습니다). – rufo

+0

BTW : 브라우저 (Chrome)에서 테스트 할 때 사용자가 로그인하지 않으면 브라우저가 기본 인증을 제공하지 않습니다. 모바일 클라이언트에는 이것이 필요하지 않지만 테스트하기에 편리합니다. 나는 그것도 점검 할 것이다. – rufo

+0

@rufo IMembershipService는 저의 구현물입니다. 아이디어를 얻으려고 거기에 넣었습니다. 당신은 자신의 impl로 그것을 대체 할 수 있습니다. – tugberk