Членство в ASP.NET - аутентифицированный пользователь теряется при вызове WebService в том же WebApp - PullRequest
0 голосов
/ 04 июня 2009

Я использую ASP.NET Login Control для аутентификации.

У меня есть несколько пользователей, и они могут успешно войти в систему. При аутентификации я перенаправляю на страницу helloworld.aspx. В методе Page_Load я сначала вызываю Membership.GetUser (). Это возвращает аутентифицированного пользователя правильно. Затем я вызываю простой веб-сервис WCF, который находится в том же веб-приложении. Первая строка моего вызова 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, как вы можете видеть по конечной точке (обратите внимание, что мое приложение зафиксировано на порту 19003) ...

адрес конечной точки = "http://localhost:19003/Services/JustinTestService.svc" binding = "basicHttpBinding" bindingConfiguration = "BasicHttpBinding_JustinTestService" contract = "JustinService.JustinTestService" name = "BasicHttpBinding_JustinTestService" /

Также переплет выглядит так ...

Может быть, это как-то связано с ???

Ответы [ 2 ]

0 голосов
/ 04 июня 2009

Получите fiddler и посмотрите, отправляется ли файл cookie аутентификации по сети.

Если это не так, возможно, вам придется связать его в своем запросе к службе.

Примерно так

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 голосов
/ 04 июня 2009

Проблема заключается в том, что вызов веб-службы не происходит из браузера, где пользователь прошел аутентификацию. Вместо этого вы инициируете вызов веб-службы из своего приложения (ваш веб-сервер создает HTTP-запрос на ваш веб-сервер!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...