FormsAuthenticate через WCF (Как сделать так, чтобы сессия применялась к браузеру ?!) - PullRequest
0 голосов
/ 02 декабря 2011

Пользователи проходят аутентификацию в службе REST WCF (моей).Учетные данные отправляются через AJAX в формате Javascript и JSON.Служба ответит OK и небольшой информацией (URL-адрес перенаправления) клиенту при аутентификации.

Теперь есть новый метод для внешней аутентификации, и мне нужно создать небольшой фрагмент кода, который легковставить и запустить внутри метода файла кода asp.net.

Типичный запрос wcf может закончиться так:
http://testuri.org/WebService/AuthenticationService.svc/ExtLogin?cId=197&aId=someName&password=!!pwd

Мой фрагмент кода до сих пор,

protected void bn_Click(object sender, EventArgs e)
{
    WebHttpBinding webHttpBinding = new WebHttpBinding();
    EndpointAddress endpointAddress = new EndpointAddress(url);

    ContractDescription cd = 
        ContractDescription.GetContract(typeof(IAuthenticationService));

    ServiceEndpoint sep = new ServiceEndpoint(cd);
    sep.Behaviors.Add(new WebHttpBehavior());
    sep.Address = endpointAddress;
    sep.Binding = webHttpBinding;

    var resp = new ChannelFactory<IAuthenticationService>(sepREST).CreateChannel();
    LoginResult result = resp.ExtLogin(cId, aId, hashPwd);

    Response.Redirect(result.RedirectUri);
    // I.e. http://testuri.org/Profile.aspx (Require authenticated to visit)
}

Я получаю правильный аутентифицированный ответ в объектах resp / result.Итак, общение в порядке.При перенаправлении на реальный сайт я не авторизован.Я не могу найти проблему?Если я возьму указанный выше URI (с действительными учетными данными) и вставлю его в URL-адрес веб-браузера, а затем вручную введу uri, я буду аутентифицирован.

Я потратил день на поиски в сети, но безуспешно,
Существует много информации, но, похоже, ни одна из них не применима.

Чего мне не хватает?

Я также попробовал другой подход, но та же проблема сохраняется.

 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uriWithParameters);
 CookieContainer cookieContainer = new CookieContainer();
 request.CookieContainer = cookieContainer;
 request.ContentType = "application/json";
 request.Accept = "application/json";
 request.Method = "GET";

 string result;
 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (Stream stream = response.GetResponseStream())
         using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
             result = reader.ReadToEnd();

 JavaScriptSerializer jsonDeserializer = new JavaScriptSerializer();
 LoginResult contact = jsonDeserializer.Deserialize<LoginResult>(result);     
 Response.Redirect(result.RedirectUri);

1 Ответ

0 голосов
/ 02 декабря 2011

Я не уверен в этом ответе, но предложу его в любом случае, так как никто не опубликовал:

Я думаю, это потому, что аутентифицированный запрос - это запрос, отправленный с помощью кода. Когда вы перенаправляете это совершенно другой запрос - он все равно не аутентифицирован.

Все методы аутентификации требуют некоторого способа поддержания аутентифицированного состояния по запросам «без сохранения состояния» = куки-файлы сеанса или какой-либо токен аутентификации.

Независимо от того, какой токен вы получите от звонка в службу аутентификации, он должен быть доступен и для запросов вашего веб-сайта - возможно, выгрузка токена из запроса в файл cookie возможна.

Можете ли вы увидеть (в чем-то вроде Fiddler) токен авторизации, отправляемый как часть запроса к RedirectUrl?

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