Проверка подлинности Asp.Net Forms при использовании iPhone UIWebView - PullRequest
61 голосов
/ 11 ноября 2010

Я пишу приложение Asp.net MVC 2, которое использует проверку подлинности с помощью форм, и в настоящее время у меня возникают проблемы с нашим приложением для iPhone в отношении проверки подлинности / входа в систему через Интернет.Мы разработали простое приложение для iPhone, которое использует элемент управления UIWebView.На этом этапе все, что приложение делает, это перейти на наш сайт Asp.Net.Просто, правда?Проблема в том, что пользователь не может пройти страницу входа.Шаги воспроизведения:

  • Откройте приложение iPhone.
  • Приложение перейдет на домашнюю страницу.
  • пользователь не прошел проверку подлинности, поэтому он перенаправлен наэкран входа / страница
  • Пользователь вводит правильное имя пользователя и пароль.нажимает на кнопку отправить.
  • на стороне сервера, пользователь проходит проверку подлинности, и файл cookie генерируется и отправляется клиенту с помощью FormsAuthentication.GetAuthCookie.
  • Сервер отправляет перенаправления для отправки пользователя на сервер.правильная домашняя страница.

Но затем пользователь перенаправляется НАЗАД на экран входа в систему!

Я сделал несколько обширных отладок по этому и тому, что я делаюЗнать это:

Файл cookie отправляется клиенту, и клиент хранит файл cookie.Проверьте это в отладчике iPhone, а также с помощью Javsascript для отображения данных cookie на странице.Файл cookie отправляется обратно на сервер.Проверено это в отладчике Visual Studio.Это правильный файл cookie (тот же, что был установлен).Свойство User.Identity.IsAuthenticated по какой-то причине возвращает значение false, хотя cookie-файл auth содержится в объекте Request.Я проверил, что приложение iPhone настроено на прием файлов cookie, и они на клиенте.

Вот забавная вещь: он отлично работает, если вы откроете браузер Safari на iPhone и перейдете на наш сайт напрямую.,

У него такое же поведение на iPad, что оно не выходит за пределы экрана входа в систему.Это репродукция на эмуляторах и на устройствах.

Этот же веб-сайт был протестирован с IE 7-8, Safari (для Windows), Blackberry, IEMobile 6.5, Phone 7, и он работает найти.Единственное обстоятельство, на котором он не работает, - это UIWebView в приложении iPhone.

Ответы [ 7 ]

44 голосов
/ 27 января 2011

У меня была точно такая же проблема, но с другим устройством (NokiaN8), и я также отследил проблему до User-Agent.

IIS использует регулярные выражения для сопоставления со строкой User-Agent. Корень проблемы заключался в том, что у него не было соответствующих регулярных выражений для конкретного устройства, и он оказался на одном из самых низких уровней соответствия, где использовались свойства Default. В свойствах по умолчанию указано, что браузер не поддерживает файлы cookie.

Решение:

  1. Добавьте в свой веб-проект папку с именем App_Browsers (щелкните проект правой кнопкой мыши, выберите: Add > Add ASP.NET Folder > App_Browsers).
  2. Добавить файл в эту папку (щелкните правой кнопкой мыши, выберите: Add > New Item). Файл может иметь любое имя, но должен иметь окончание .browser.
  3. Добавьте подходящее выражение и правильные возможности (или внесите изменения в Default).

Два примера:

<browsers>
  <browser id="NokiaN8" parentID="Mozilla">
    <identification>
      <userAgent match="NokiaN8" />
    </identification>
    <capabilities>
      <capability name="browser" value="NokiaN8" />
      <capability name="cookies" value="true" /> 
    </capabilities> 
  </browser> 
</browsers>

Или изменить значение по умолчанию:

<browsers>
  <browser refID="Default"> 
    <capabilities> 
      <capability name="cookies" value="true" /> 
    </capabilities>
  </browser>
</browsers>

Дополнительная информация: Схема файла определения браузера

42 голосов
/ 21 апреля 2011

Мы нашли решение создать файл (generic.browser) и включить этот XML-файл, чтобы сообщить веб-серверу, что «Mozilla» и настройки браузера по умолчанию должны поддерживать файлы cookie.

<browser refID="Mozilla" >
    <capabilities>
        <capability name="cookies"  value="true" />
    </capabilities>
</browser>
17 голосов
/ 21 февраля 2012

Это исправлено в ASP.NET 4.5, и предполагается, что все браузеры поддерживают файлы cookie, поэтому дополнительный файл .browser не понадобится.

5 голосов
/ 14 декабря 2010

Из проведенного мною исследования причина, по которой вы не можете установить User-Agent, заключается в том, что UIWebView устанавливает значение User-Agent непосредственно перед отправкой запроса, то есть после того, как вы сделали запрос.из вашего кода.

Хитрость, чтобы обойти эту проблему, состоит в том, чтобы использовать нечто, называемое «перебор методов», продвинутую и потенциально опасную концепцию Objective-C, которая заменяет стандартный метод на тот, который вы предоставляете.Конечный результат состоит в том, что когда ваш запрос отсылается, а код платформы добавляет User-Agent, он будет обманут, используя предоставленный вами метод.

Ниже объясняется, что я сделал для реализации этого, но яЭксперт Objective-C и предложил бы вам сделать некоторые исследования, чтобы ознакомиться с техникой.В частности, там была ссылка, объясняющая лучше меня, что здесь происходит, но в данный момент я не могу ее найти.

1) Добавьте категорию на NSObject, чтобы разрешить свистлинг.

@interface NSObject (Swizzle)

+ (BOOL) swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector;

@end

@implementation NSObject (Swizzle)


+ (BOOL) swizzleMethod:(SEL) origSelector withMethod:(SEL)newSelector
{
    Method origMethod= class_getInstanceMethod(self, origSelector);
    Method newMethod= class_getInstanceMethod(self, newSelector);

    if (origMethod && newMethod)
    {
        if (class_addMethod(self, origSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        {
            class_replaceMethod(self, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
        }
        else {
            method_exchangeImplementations(origMethod, newMethod);
        }
        return YES;
    }
    return NO;
}
@end

2) Подкласс NSMutableURLRequest, чтобы разрешить swizzle:

@interface NSMutableURLRequest (MyMutableURLRequest)

+ (void) setupUserAgentOverwrite;

@end
@implementation NSMutableURLRequest (MyMutableURLRequest)

- (void) newSetValue:(NSString*)value forHTTPHeaderField:(NSString*)field
{
    if ([field isEqualToString:@"User-Agent"])
    {
        value = USER_AGENT;  // ie, the value I want to use.
    }
    [self newSetValue:value forHTTPHeaderField:field];
}
+ (void) setupUserAgentOverwrite
{
    [self swizzleMethod:@selector(setValue:forHTTPHeaderField:) 
             withMethod:@selector(newSetValue:forHTTPHeaderField:)];

}

@end

3) Вызвать статический метод, чтобы поменять метод.Я сделал этот вызов в didFinishLaunchingWithOptions:

// Need to call this method so that User-Agent get updated correctly:
[NSMutableURLRequest setupUserAgentOverwrite];

4) А затем использовал его следующим образом.(Делегат соединения сохраняет данные в изменяемом массиве, а затем вручную устанавливает UIWebView, используя метод loadData, когда завершает загрузку).

- (void)loadWithURLString:(NSString*)urlString
{
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
_connection = [NSURLConnection connectionWithRequest:request delegate:self];
[_connection start];
}
3 голосов
/ 27 августа 2012

У меня была точно такая же проблема, я исследовал и консолидировал полное решение (ответы сверху и другие темы) здесь: http://www.bloggersworld.com/index.php/asp-net-forms-authentication-iphone-cookies/

0 голосов
/ 03 июня 2013

Причина этого, по-видимому, связана с тем фактом, что если пользовательский агент неизвестен, предполагается, что браузер не принимает cookie-файлы (как ответили другие), и вместо этого IIS помещает значение ASPXAUTH в URL-адрес. .

Однако система маршрутизации MVC, по-видимому, упустила эту возможность, что явно является ошибкой, и поэтому она все испортила.

Хотя добавление .browser с пользовательским пользовательским агентом решает проблему, это не гарантирует, что другие пользовательские агенты также будут решены, и на самом деле я обнаружил, что браузер K9 для android также имеет эту проблему, и как таковое, это только решение, если кто-то имеет систему регистрации, такую ​​как elmeh, чтобы отследить такие ошибки.

С другой стороны, добавление значения по умолчанию поднимает вопрос, правда ли, что все браузеры принимают файлы cookie, что, по-видимому, и является причиной того, что IIS не допускает этого.

Однако, кроме явного добавления пользовательских агентов, можно добавить в метод global.asax RegiterRoutes () явный обработчик для его игнорирования следующим образом:

         routes.MapRoute(
            "CookieLess", // Route name
            "(F({Cookie}))/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

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

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

0 голосов
/ 14 декабря 2010
  1. Вы указали DestinationPageUrl в разметке?

  2. Вы указали defaultURL в web.config?

Пример web.config

<authentication mode="Forms">
     <forms loginUrl="~/Login.aspx" defaultUrl="~/CustomerArea/Default.aspx"/>
</authentication>

Пример DestinationPageUrl

 <asp:Login ID="Login" runat="server" DestinationPageUrl="~/Secret/Default.aspx" />

Наконец, вы смотрели в банку с cookie и видели, существует ли ваш сеансовый cookie?

Где хранятся файлы cookie UIWebView?

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