C# Basic Authentication 를 이용한 WebAPI Authentication

Basic Authentication (기본인증)

ㆍ앞에서 살펴본  Middleware , Attribute 를 사용하는 웹API 은 인증 방식과 더불어, Base Authenticaion 또한 요청헤더에
   정보를 보내고, 서버로 부터 Authorization 을 받는 매커니즘은 거의 같다. 아니 아예같다.
  (middleware 로도 서비스 할 수 있고 attribute 로도 가능하다. – 용도에 따라 다르게 구현하자)

   단, 아래와 같이 몇가지 규격을 갖는다면,

   http에 추가되는 헤더명은Authorization” 으로 할것
   ② 인코딩 맨앞 문자열“Basic” 문자열을 포함할것.
    Authorization 키의 값은 “아이디:패스워드” 포맷으로 Base64 인코딩할것 ,
  정리하면 아래와 같다

Autorization : Basic dGVzdDoxMjM0
(Basic 과 값 사이에 띄어쓰기)


코드로 구현해보면,

string UserInfo = string.concat(userid , “:”  , password);
byte [] UserInfoBytes = Encoding.UTF8.GetBytes(UserInfo);
string UserInfoBase64 = Convert.ToBase64String(UserInfoBytes );


http.DefaultRequestHeaders.Add(“Authorization”, string.Concat(“Basic” , ” ” , userIdBase64, “:” , passwordBase64);

 // base64 문자열 복원
byte [] decodeInfoBytes= System.Convert.FromBase64String(UserInfoBase64 );
string decodeInfoString = System.Text.Encoding.Default.GetString(decodeInfoBytes);

Base64 로 인코딩을 하더라도, 쉽게 디코딩이 되기때문에, https 보안채널을 이용하도록 한다.
https 채널을 이용한다 하더라도 보안이 완전하지 않으며, 사용 환경을 보고 적절히, 이 인증방식을 사용하여야 한다.
(좀더 암호화를 복잡하고 하고자하면 salt  값을 이용하기도 하자)

[Middelware로 구현하는 Base Authentication]
public async Task InvokeAsync(HttpContext context)
{
       // http 헤더 키가 “Authorization” 의 값 가져오기
       string authUserInfo = context.Request.Headers[“Authorization”];

       // Basic 대소문자 구분함
       if (authUserInfo != null && authUserInfo.StartsWith(“Basic”))
       {
             // 값의 Basic 뒤의 ID:password 값을 가져온다.
             string userInfoBase64 = authUserInfo.Substring(“Basic”.Length).Trim();

             // Base64 문자열을 디코딩하여 bytes로 리턴
             // Convert.FromBase64String(s) base64로 된 문자열 s 를 인자로 받아, 디코딩된 문자열의 값을 bytes 로 리턴
             byte[] userInfoBytes = Convert.FromBase64String(userInfoBase64);

             // bytes 로 디코딩된 문자열(문자별 코드값) 을 string 형으로 변환
             string userInfo = System.Text.Encoding.UTF8.GetString(userInfoBytes);

             // 구분값으르로 : userid 와 password 분리
             string [] userInfoArray = userInfo.Split(‘:’);

             string userId = userInfoArray[0];
             string userPassword = userInfoArray[1];

              if(userId == “test” && userPassword == “1234”)
              {
                    await this._next(context);
              }
              else
              {
                    await context.Response.WriteAsync(“403. Basic Authentication error”);
                    return;
              }
       }
       else
       {
             await context.Response.WriteAsync(“Basic Authentication userinfo is null or Empty”);
             return;
       }
}

[ Client ]  – header 추가
Autorization : Basic dGVzdDoxMjM0
Key : Authoriztion value : Baise  [id and password base64values] // dGVzdDoxMjM0 (test:1234)

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다