2015-01-04 2 views
1

[WebAPI Basic Authentication Authorization Filter]을 사용하여 간단한 웹 API 데이터 서비스를 사용할 때 사용자를 인증합니다.WebAPI 기본 인증 권한 필터 및 기계 키

질문 : 모든 것이 localhost에서 작동하지만 웹에 서비스를 게시 할 때 (http://www.mywebsite.com) 클라이언트 응용 프로그램은 항상 "Unauthorize"응답을 얻습니다.

이 라인은 원격 IIS 관리자 있지만 그래도 문제를 사용하여 시스템 키를 추가로 시도 웹

//client.BaseAddress = new Uri("http://localhost:11992/"); // on localhost work 
    client.BaseAddress = new Uri("http://mywebsite.com/"); // returns 401 Unauthorized 

에 로컬 호스트로부터 전환 할 때 I는 (클라이언트 측)를 변경하는 모든 것이다. 아직 그다지 일

enter image description here 다음과 같이 IIS에

enter image description here

참조 system.web (Web.config의)이 시스템 키 enter image description here

인증 모드이다. 분명히 나는 ​​여기서 뭔가를 놓치고있다.

업데이트 나는 기본 인증을 확장하고 있습니다. 필터 (나중에 클라이언트 측에서 액세스하는 컨트롤러 동작에 적용) 필터

및이 사용자 지정 인증 내부. 하드 사용자 이름이 필터링

public class MyBasicAuthenticationFilter : BasicAuthenticationFilter 
{ 

    public MyBasicAuthenticationFilter() 
    { } 

    public MyBasicAuthenticationFilter(bool active) 
     : base(active) 
    { } 


    protected override bool OnAuthorizeUser(string username, string password, HttpActionContext actionContext) 
    { 
     if (username == "myuser" && password == "mypass") 
      return true; 
     else 
      return false; 
    } 
} 

을 전달하고 클라이언트 측에서 내가 혼란 스러워요

client.BaseAddress = new Uri("http://mywebsite.com/"); 
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
       Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
       string.Format("{0}:{1}", "myuser", "mypass")))); 

(클라이언트 WPF) 때문에 동일한 코드 작업 로컬 호스트에 잘하지만 난 코드를 게시하고이 클라이언트를 변경할 때. 내 실제 웹 사이트 URL에 BaseAddress는 401 오류를 반환합니다.

+1

코드 예제를 확장하여 사용자 자격 증명을 설정하는 방법을 보여 주시겠습니까? 401 unauthorized는 자격 증명이 제공되지 않았거나 제공된 자격이 유효하지 않음을 의미합니다. 인증하는 사용자 계정이 서버에 있습니까? 참고 : 기본 키는 컴퓨터 키를 사용하지 않습니다. – Adrian

+0

@Adrian, 질문이 업데이트되었습니다. – user1765862

+0

연장중인 "WebAPI 기본 인증 필터"란 무엇입니까? 질문의 링크가 기계 키 이미지로 이동합니다. 이 링크가 올바른 링크인지 확인하십시오. http://weblog.west-wind.com/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter – Adrian

답변

1

주어진 BasicAuthenticationFilter 클래스 Rick Strahl's Web Log은 시스템의 기본 인코딩을 사용하여 인증 헤더에서 사용자 자격 증명을 추출합니다. Encoding.Default 속성에 대한 MSDN documentation에 따라 :

다른 컴퓨터는 기본적으로 다른 인코딩을 사용할 수 있으며, 는 기본 인코딩도 하나의 컴퓨터에서 변경할 수 있습니다. 따라서 한 컴퓨터에서 다른 컴퓨터로 스트리밍 된 데이터 또는 동일한 컴퓨터에서 다른 시간에 검색된 데이터가 잘못 변환 될 수 있습니다. 또한 Default 속성에 의해 반환 된 인코딩은 가장 적합한 fallback을 사용하여 지원되지 않는 문자를 코드 페이지에서 지원하는 문자 에 매핑합니다. 이러한 두 가지 이유로 기본 인코딩을 사용하는 것은 일반적으로 권장되지 않습니다. 인코딩 된 바이트 이 올바르게 디코딩되도록하려면 UTF8Encoding 또는 UnicodeEncoding과 같은 유니 코드 인코딩을 프리앰블과 함께 사용해야합니다. 또 다른 옵션은 에 더 높은 수준의 프로토콜을 사용하여 동일한 형식이 인코딩 및 디코딩에 사용되는지 확인하는 것입니다.

제공되는 정보에 따르면이 코드는 주로 코드가 배포 된 서버의 구성에 따라 다른 결과를 줄 가능성이있는 코드 라인입니다.

Encoding iso88591 = Encoding.GetEncoding("iso-8859-1"); 
authHeader = iso88591.GetString(Convert.FromBase64String(authHeader)); 

ISO-8859-1 당신에게 최고의 호환성을 제공합니다 : 다음 코드로

authHeader = Encoding.Default.GetString(Convert.FromBase64String(authHeader)); 

: 나는 그러므로 BasicAuthenticationFilter 클래스의 ParseAuthorizationHeader 방법에 다음 줄을 교체 고려할 것

기본 인증 헤더를 보내는 모든 클라이언트와 HTTP 기본 인증을 수행 할 때 사용할 권장 인코딩에 대한 다음 StackOverflow 질문을 참조하십시오. What encoding should I use for HTTP Basic Authentication?

또는 WCF 클라이언트에서 API를 호출하는 사람이 유일하다면 사용자 이름과 암호가 서버와 동일한 문자 코드로 디코드됩니다.