문제

내가 쓴 Silverlight2 응용 프로그램과 통신하 WCF 서비스(BasicHttpBinding).이 사이트를 호스팅 Silverlight 콘텐츠를 사용하여 보호됩니다 ASP.NET 회 공급자입니다.액세스할 수 있는 현재 사용하는 사용자 HttpContext.현재 있습니다.사용자.정체성입니다.에서 이름을 내 WCF 서비스,그리고 내가 설정한 AspNetCompatibilityRequirementsMode.

나는 지금은 쓰고 윈도우를 사용하여 응용 프로그램을 정확히 동일한 웹 서비스입니다.인증을 처리가 가능하 인증 서비스, 고 부를 수 있는"login"하는 인증에 사용하는 사용자...좋아요 모든 좋은...그러나 도대체 어떻게 얻을 인증하는 쿠키 설정에 다른 서비스 클라이언트는?!

두 서비스 모두에서 호스팅하는 같은 도메인

  • MyDataService.svc <-다루는 하나 나의 데이터
  • AuthenticationService.svc <-한 windows 응용 프로그램을 호출 할 수 있고 인증합니다.

나는 원하지 않을 만드는 새로운 서비스를 windows 클라이언트,사용하거나 다른 바인딩...

클라이언트 응용 프로그램 서비스는 또 다른 대안이 있지만,모든 예를은 제한을 표시하는 방법,사용자 역할과 그의 프로필...하지만 일단 우리가 인증을 사용하여 클라이언트 응용 프로그램 서비스가 있어야 얻을 수있는 방법을 인증하는 쿠키에 연결된 서비스 클라이언트를 호출할 때는 다시 동일 서버입니다.

에 따라 입력하는 동료에서 솔루션을 추가하 wsHttpBinding 엔드 포인트,하지만 나는 내가 주위에 얻을 수 있습니다 그...

도움이 되었습니까?

해결책

마지막으로는 방법을 발견 이 작업을 확인합니다.인증을 위해 나를 사용하"WCF 인증 서비스".할 때에 인증 서비스는 설정하려고 하는 인증 쿠키입니다.왜 이 쿠키의 응답 추가하면 다른 모든 요청이 다른 웹 서비스를 동일한 컴퓨터에 있습니다.코드는 다음과 같습니다:

var authService = new AuthService.AuthenticationServiceClient();
var diveService = new DiveLogService.DiveLogServiceClient();

string cookieHeader = "";
using (OperationContextScope scope = new OperationContextScope(authService.InnerChannel))
{
    HttpRequestMessageProperty requestProperty = new HttpRequestMessageProperty();
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty;
    bool isGood = authService.Login("jonas", "jonas", string.Empty, true);
    MessageProperties properties = OperationContext.Current.IncomingMessageProperties;
    HttpResponseMessageProperty responseProperty = (HttpResponseMessageProperty)properties[HttpResponseMessageProperty.Name];
    cookieHeader = responseProperty.Headers[HttpResponseHeader.SetCookie];                
}

using (OperationContextScope scope = new OperationContextScope(diveService.InnerChannel))
{
    HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty();
    OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest);
    httpRequest.Headers.Add(HttpRequestHeader.Cookie, cookieHeader);
    var res = diveService.GetDives();
}      

당신이 볼 수 있듯이 나는 두 개의 서비스는 클라이언트,하나의 fo 인증 서비스,그리고 중 하나에 대한 서비스를 사용입니다.첫번째 블록 전화 로그인 방법을 잡아 인증 쿠키의 반응이다.두 번째 블록을 추가하는 헤더를 요청을 호출하기 전에"GetDives"서비스 방법입니다.

나는 행복하지 않은 이 코드는 모두에서,그리고 나는 생각한 더 나은 대안이 될 수 있을 사용하"웹 참조하"대신에"서비스"를 참조 및 사용.NET2.0 스택을 대신 합니다.

다른 팁

웹 서비스,같은 사람들에 의해 만들어서 이를 사용하여 서비스에서는 종종에서 사용하기에 가장 좋 a"stateless"방법,그래서 각 호출하는 웹 서비스 시작 새로.이를 단순화 서버 코드로 필요가 없는"세션"회상 상태의 클라이언트입니다.그것은 또한 단순화하는 클라이언트 코드로 필요가 없 티켓을 잡아,쿠키,또는 다른 geegaws 는 뭔가 가정 하의 상태에 대해 서버입니다.

을 만드는 두 개의 서비스에서는 방법을 설명하는 소개합 의 상태.클라이언트가 어느"된다"또는"인증되지 않",그리고 MyDataService.svc 를 알아낼 수 있습니다.

그렇다면,내가 찾은 WCF 잘 작동하는 경우 회원은 제공자가 사용하는 인증 호출 서비스입니다.그래서 예를 들어,주,당신을 추가하려는 회원자 인증 gubbins 서비스를 위한 구성 MyDataService 필요가 없고,별도 인증 서비스에서 모두.

자세한 내용은 MSDN 문서를 참조 하십시오 .

[무엇이 매우 매력에 대해 이해할 수 있도록 도와주세요 나 게으른,이는 전적으로 선언한다.나는 단순히 흩어 오른쪽에 구성 항목에 대한 내 MembershipProvider 습니다.구성을 위한 응용 프로그램!bingo!모든 통화를하는 모든 계약에서 서비스 인증됩니다.]

그것이 공평하 이하지 않는 특히 빠르다.사용하는 경우에는 SQL 서버에 대한 인증 데이터베이스에 당신은 적어도 하나는,아마도 두 저장 프로시저를 통화당 서비스를 호출합니다.에서 많은 경우(특히 HTTP 에 대한 바인딩)오버헤드 서비스의 전화 자체가 큰 것입;하지 않을 경우,고려 회전자 구현의 회원을 공급자 캐시하는 인증을 요청합니다.

중 하나이 제공하는 기능을 제공하"login"기능입니다.이를 위해,당신을 제공할 수 있습니다 an(인증된!) 하는 서비스 계약은 아무것도(다른 것보다 올리는 오류 인증이 실패하는 경우),또는 사용할 수 있습니다 멤버십 서비스 공급자에 설명된 대로 원래 참조 문서입니다.

클라이언트에서 수정 <binding> 태그에 대한 서비스(내 <system.serviceModel>)을 포함한다:allowCookies="true"

응용 프로그램이 이제는 지속 쿠키고 그것을 사용할 수 있습니다.당신은 참고 IsLoggedIn 지금 true 를 반환한 후에는 로그에서-그것 false 를 반환하지 않는 경우에 허용 쿠키.

숨기 많은 여분의 뒤에 코드를 사용자 정의 메시지 검사 및 행동하지 않도록 처리해야의 땜질 OperationContextScope 다.

내가 하려고 합 모의 무언가를 나중에고합니다 유의하시기 바랍니다.

--larsw

당신이 해야 살펴보 CookieContainer 체에서 System.Net.이 개체할 수 있는 비 클라이언트 브라우저에 쿠키가 있습니다.이것은 무엇을 내 팀은 사용되는 마지막 시간에 우리는 실로 하는 문제입니다.

여기에 간단한 문서 하는 방법에 대해 이동됩니다.가 더 있을 수 있습니다 그들은 거기에 있지만,이해 당신을 얻을 시작했다.

우리가 무국적자에 대한 경로의 우리의 현재 설정 WCF 서비스 및 Silverlight2 응용 프로그램.그것이 가능한 Silverlight2 하는 서비스와 함께 작동하는 바인딩을 가진 TransportWithMessageCredential 보안,하지만 그것은 일부 사용자 정의 보안 코드에 Silverlight 측.결과는 어떤 응용 프로그램에 액세스할 수 있는 서비스는 단순히 설정하여 사용자 이름과 비밀번호를 사용하여 메시지의 헤더가 있습니다.이 할 수 있는 한 사용자 지정 IRequestChannel 구현하도록 개발자들에 대해 걱정할 필요가 없습니다 설정 값 자체.하지만 WCF 가 없는 쉬운 방법 개발자들이 이렇게 생각입함으로 설정됩니다.보안입니다.사용자 이름과함으로 설정됩니다.보안입니다.암호 또는 무언가가 동등하게 간단합니다.

내가 이것을 썼다는 할 때 내가 다시 사용하여 클라이언트 응용 프로그램 서비스에 대해 인증을 수행하기 위해 웹 서비스를 사용하고 있습니다.그것은 사용하는 메시지는 관리자를 삽입하려면 쿠키 헤더가 있습니다.어 단어가 있는 파일로 설명서 및 데모 프로젝트입니다.하지 않지만 그 정확히 무엇을 하고 있는,그것의 매우 가깝습니다.에서 다운로드할 수 있습니다 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top