1

Basic Auth를 사용하여 WebApi를 멋지게 사용합니다. 그리고 Forms Auth를 사용하여 MVC 사이트를 멋지게 만듭니다. 하지만 여기 잡을 :기본 인증을 사용하는 Forms Auth 및 WebApi가있는 ASP.NET MVC

클라이언트 X는 연락처 및 제품의 번호와 전용 데이터베이스가 있습니다. MVC 사이트는 자신의 연락처 (Forms Auth를 통해)에 로그인하고 제품 주문을 할 수있는 ({clientId} 라우팅을 통한) 전용 사이트입니다. 주문을하려면 담당자가 로그인해야합니다.

제품은 클라이언트의 데이터베이스에 기록 할 WebApi를 주문합니다.

하지만 WebApi는 기본 인증을 사용하여 주문한 담당자가 아닌 클라이언트의 유효성을 검사하므로 모든 요청은 401 - Unauthorized입니다.

나는 여기에 많은 게시물에 의해 제안 된 것처럼 ThinkTecture를 체크 아웃했지만 WebApi에서 Forms Auth를 허용하지 않기 때문에 필자에게 필요한 것은 얻을 수 없다. WebApi에서 클라이언트 데이터베이스의 연락처를 인증하고 싶지 않습니다. WebApi에서 클라이언트를 인증하려고합니다.

비슷한 시나리오를 경험 한 사람이 있습니까? 그리고 눈에 띄게 분명한 사실을 놓친 사람이 있습니까? 아마도 사이트에서 Forms와 Basic을 모두 구현해야합니까?

내가 사이트에서 만들고있어 매우 표준 API 호출 (사용자 이름과 암호는 클라이언트의 아닌 상대의) : 나는 별도의 테스트 클라이언트를 설정하고 동일 할 경우

var clientId = new Guid(RouteData.Values["clientId"].ToString()); 
var baseUrl = ConfigurationManager.AppSettings["ApiBaseAddress"]; 
var authHeader = Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", _shoppingCartSettings.UserName, _shoppingCartSettings.Password))); 
var requestUrl = String.Format("api/{0}/inventory", clientId.ToString()); 

var httpWebRequest = WebRequest.Create(baseUrl + requestUrl); 

httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "Basic " + authHeader); 
httpWebRequest.Method = "GET"; 
httpWebRequest.Accept = "application/json"; 
httpWebRequest.ContentType = "application/json"; 

try 
{ 
    using (var httpWebResponse = httpWebRequest.GetResponse()) 
    { 
     // we never get here because of a 401 
    } 
} 
catch (WebException ex) 
{ 
    using (var httpWebResponse = ex.Response) 
    { 
     // we always get here 
    } 
} 

전화를 걸면 작동합니다./

답변

0

별로 눈에 잘 띄지 않는 벽에 머리를 많이 치고, @ 0leg에 의해 많이 필요로하게 된 원인을 발견했습니다. Web>Servers에서 내 WebApi 프로젝트 파일의 등록 정보

Visual Studio Development Server이의 Virtual Path으로 사용되고 있었다 "/"내 MVC 프로젝트 파일이 Local IIS Web Server을 사용하도록 설정 한 반면. MVC 프로젝트에도 Apply server settings to all users (store in project file) 옵션이 선택되어 있습니다.

모두 로컬 IIS 서버를 사용하도록 설정하면 해결되었습니다.

이제는 다른 서버에서 실행 중이므로 더 이상 고려할 때 논리적 인 것처럼 보입니다.

후임을 위해 게시 중입니다.

0

모든 클라이언트의 주문을 제출할 수있는 MVC 사이트에 대한 로그인 정보를 가지고 있지 않은 이유는 무엇입니까? WebAPI가 고객이 스스로 주문을 제출할 수 있도록 허용하는 것이 좋습니다. 하지만 MVC 사이트가 연락처를 기반으로 서로 다른 클라이언트로 인증되도록하는 것이 타당하지 않다고 생각합니다. MVC 사이트는 각 클라이언트의 비밀번호를 저장해야합니다.

대신 MVC 사이트에 대해 하나의 로그인을 만들고 모든 클라이언트에 대한 주문을 제출할 수있는 권한을 부여하십시오.

1

웹 API는 MVC 사이트와 동일한 가상 디렉터리 및 구성하에 있습니까? API에 대해 Forms Auth HTTP 모듈이 작동하는 것처럼 보입니다. 원하지 않는 API입니다. 브라우저에서 API를 직접 호출하지 않으려는 경우 API의 web.config에 폼 인증 모듈이없는 기본 인증을 위해 독점적으로 설정된 별도의 가상 디렉터리로 이동하십시오.

+0

그래, 그들은 분명히 자신의 configs와 별도의 가상 디렉토리에 있습니다. web.configs에서 MVC 사이트가 "Forms"로 설정되고 WebApi가 "None"으로 설정됩니다. – McCee

+0

올바른 방향으로 밀어 주셔서 감사합니다. 알아 냈어. – McCee