0

認証にASP.NETログインコントロールを使用しています。ASP.NETメンバーシップ - 同じWebAppでWebServiceを呼び出すと、認証されたユーザーが失われる

私はいくつかのユーザーがおり、ログインに成功しています。認証されると、helloworld.aspxというページにリダイレクトされます。 Page_Loadメソッドでは、まずMembership.GetUser()を呼び出します。これにより、認証されたユーザーが適切に返されます。次に、同じWebアプリケーションにある単純なWCF Webサービスを呼び出します。私のWebService呼び出しの最初の行は同じMembership.GetUser()です。今度はNULLを返します。

どのような考えですか?ここで

おかげで、 ジャスティン

は、以前のサービスのソースコード述べたように、いくつかのコードが

JustinPage.aspx

public partial class JustinPage : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     MembershipUser user = Membership.GetUser(); 
     // user is a valid user 

     JustinService.JustinTestServiceClient justin = new CMS.WEB.JustinService.JustinTestServiceClient(); 
     justin.DoWork(); 
    } 
} 

JustinTestService.svc.cs

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class JustinTestService 
{ 
    [OperationContract] 
    public void DoWork() 
    { 
     MembershipUser user = Membership.GetUser(); 
     // user is NULL ??? Why? 
     return; 
    } 
} 

スニペットですJustin.aspxと同じWebアプリケーションにあります私のアプリケーションはポート19003で固定されています)。

エンドポイントアドレス= "http:// localhost:19003/Services/JustinTestService.svc" binding = "basicHttpBinding" bindingConfiguration = " BasicHttpBinding_JustinTestService」 契約= "JustinService.JustinTestService" 名前= "BasicHttpBinding_JustinTestService" 結合/

また、このような結合ルックス

...

<名= "BasicHttpBinding_JustinTestService" です。CloseTimeout = "00:01:00" openTimeout = "00:01:00" receiveTimeout = "00:10:00" sendTimeout = "00:01:00" allowCookies = "false" をbypassProxyOnLocal = "false" をhos​​tNameComparisonMode = "StrongWildcard" のMaxBufferSize = "65536" maxBufferPoolSize = "524288" maxReceivedMessageSize = "65536" messageEncoding = "テキスト" textEncoding = "UTF-8" transferModeは= "バッファ" useDefaultWebProxy = "true" を> < readerQuotas MAXDEPTH = "32" maxStringContentLength = "8192" maxArrayLength = "16384" maxBytesPerRead = "4096" maxNameTableCharCount = "16384"/> <セキュリティモード= "なし" > < /セキュリティ> </binding >

多分<セキュリティモード= "なし"と関係があります> ???

答えて

0

問題は、Webサービスコールが、ユーザが認証されたブラウザから発信されていないことです。代わりに、アプリケーションからWebサービスコールを発信しています(WebサーバーがWebサーバーへのHTTP要求を作成しています)。

+0

HRMのような

何か... [OK]を合意しました。私は意図的にこれをやっていました。なぜなら私はすべてのクライアントが通信する共通の契約を作りたいからです。私はこのWebAppに同じアプリケーションに常駐しているという理由だけで、ビジネスレイヤへの特別なアクセス権を与えたくありません。すべてのクライアントアプリケーションは同じAPIを使用する必要があります。推奨されるソリューションは、直接サービスに電話することですか?私はすでにこの作品を知っているが、間違っている可能性がありますので一貫しているようにしていた – Justin

+0

現在ログインしているユーザーの資格情報を取得してWebサービスに送信することができますが、安全であるかどうかはわかりません。 Webサービスは外部に公開されているのか、内部だけに公開されていますか? – pgb

0

フィドラーを取得し、認証クッキーが電送されているかどうかを確認します。

サービスにリクエストする際にバンドルする必要がある場合があります。この

Service1Client ws = new Service1Client(); // Name of webclient proxy 
      using (OperationContextScope scope = new OperationContextScope(ws.InnerChannel)) 
      { 
       HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty(); 
       OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest); 

       HttpCookieCollection cc = Page.Request.Cookies; 
       if (Request.Cookies[".ASPXAUTH"] != null) 
       { 
        HttpCookie aCookie = Request.Cookies[".ASPXAUTH"]; 
        String authcookieValue = Server.HtmlEncode(aCookie.Value); 
        httpRequest.Headers.Add("Cookie: " + ".ASPXAUTH=" + authcookieValue); 
       } 

       // Make call to webservice here 
       ws.MyWCFCall(); 

       HttpResponseMessageProperty response = (HttpResponseMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpResponseMessageProperty.Name]; 
      } 
+0

Silverlight 3で動作するはずですか? – tomo

関連する問題