2012-11-22 2 views
1

WebAPI 및 AngularJs를 기반으로 응용 프로그램에 대한 권한 부여 메커니즘을 만들고 싶습니다.Asp.NET WebAPI 사용자 지정 승인

BasicHttpAuthentication을 사용하는 몇 가지 기사를 보았습니다.하지만 모든 요청에 ​​사용자 이름과 암호를 보내는 것에 대한 모든 아이디어가 마음에 들지 않습니다. 내가 OpenId 인증을 사용하기를 원하기 때문에 사용자 이름/암호 쌍을 가지고 있지 않기 때문에 더 적합하지 않습니다.

솔루션에 대해 생각하고 있지만 구현 방법을 모르겠습니다. 개념은 사용자가 일반적인 웹 응용 프로그램 에서처럼 인증된다는 것입니다. 사용자/암호가있는 양식을 게시하거나 OpenId 공급자를 선택합니다. 사용자가 성공적으로 인증되면 일정 시간 동안 User 객체를 저장하는 정적 객체에 배치됩니다. 다음으로 usertoken이 생성되어 클라이언트 응용 프로그램에 전달됩니다. 클라이언트는 데이터를 가져올 권한이있는 적절한 인증 토큰으로 위에서 언급 한 정적 객체에 사용자가있는 경우 각 요청에 대해 토큰을 서버에 전달합니다.

먼저 -이 문제에 대한 좋은 접근 방법이라고 생각하십니까? 둘째 - 쿠키를 사용하지 않고 인증 토큰을 어떻게 전달해야합니까? BasicHttpAuthentication과 같이 요청 헤더에 있어야한다고 생각합니다. 그러나 실제로 처리하는 방법을 모르겠습니다.

답변

1

BasicHttpAuthentication 내가 모든 요청과 함께 전송 영원히 클라이언트의 사용자 이름과 암호를 캐싱 약 더러운 느낌에 당신과 함께 있어요

. 자신에 대해 작동 할 수있는 기본 인증의 또 다른 측면은 사인 오프 (sign-off)의 부족입니다. 암호 변경 이외에 기본 인증 세션을 "무효화"할 수 없습니다. 한편 토큰은 일반적으로 만료일을 제공하며 서버 측 무효화를 원할 경우 발급일을 확인하고 "발급일 xyz보다 오래된 모든 토큰은 유효하지 않습니다"라고 말할 수 있습니다.

서버 상태

당신은 "사용자가 성공적으로 인증되면, 그것은 정적 객체에 배치됩니다"언급. 하지만 이것은 토큰과 관계가 없습니까? 이것은 인증 세션의 서버 상태 관리를 구현하려는 것처럼 들리지만, 반드시 그런 것은 아닙니다. 토큰 자체는 사용자 인증에 충분해야하며, 서버 상태를 관리하는 것이 또 다른 잠재적 인 장애물입니다. 응용 프로그램 풀 재활용 또는 웹 팜 환경을 고려할 때 서버 상태를 관리하기가 어려워 질 수 있습니다 (두 개의 서비스가 동일한 인증 토큰을 공유하지만 상태/세션을 저장하기 위해 중앙 "인증 서버"와 통신 할 필요가없는 경우에는 어떻게해야합니까? ?)

인증 토큰

헤더를 전달 확실히 그것을위한 좋은 장소입니다. 정말로, 다른 곳은 어디입니까? 쿠키, 헤더, 메시지. 브라우저 클라이언트 이외에 쿠키는별로 의미가 없으므로 메시지에 포함 시키면 메시지 포맷이 약간 흐릿해질 수 있습니다. 따라서 머리글은 내 관점에서 볼 때 가장 합리적인 옵션입니다.

클라이언트 구현

당신이 지정,하지만 난 당신이 .NET에서 서비스를 호출에 관심이 의심 적이 없다? 이 경우 System.Net.Http.HttpClient은 (는) 친구가 될 수 있습니다. 특히 DefaultRequestHeaders 컬렉션입니다. 이를 사용하여 사용자 정의 헤더를 추가하여 인증 토큰을 저장할 수 있습니다.최근 ASP.NET 인증을 연구 할 때

서버 구현

, 나는 Mixed Authentication Disposition ASP.NET Module (부인)을 검사하여 사용자 정의에 대해 많은 것을 배웠습니다. 나는 MADAM을 그대로 사용하는 것에 관심이 없었습니다. 그러나이 기사에서 그것에 대해 배우고 source code을 검토하면 웹 인증 모듈을 웹 스택에 삽입 할 수있는 방법에 대해 많은 아이디어를 얻을 수있었습니다.

+0

인증 토큰을 사용하라는 제안에 따라 서버를 호출 할 때마다 만료 날짜를 다시 설정하려면 어떻게해야합니까? 누가 어떻게 재설정합니까? 클라이언트 또는 서버입니까? –

+0

"만료 날짜 재설정"으로 미루어 만기가 만료되는 시나리오를 말하는 것 같습니다. 따라서 로그인 호출은 2 시간 만료 토큰을 반환 할 수 있으며 이후의 각 호출 (반드시 로그인 할 필요는 없음)은 호출 시간으로부터 2 시간으로 해당 만료를 재설정해야합니까? 클라이언트와 서버 모두 시나리오를 알고 있어야합니다. 서버는 모든 호출 (응답 만료)에 대한 응답 헤더에 새 인증 토큰을 보낼 수 있습니다. 그러면 클라이언트는 해당 헤더를 읽고 다음 호출에 새 토큰을 사용합니다. – Snixtor