source

iPhone UI WebView 사용 시 As.Net 양식

lovecheck 2023. 6. 11. 10:57
반응형

iPhone UI WebView 사용 시 As.Net 양식

양식 인증을 사용하는 Asp.net MVC 2 애플리케이션을 작성하고 있으며, 현재 웹 상에서의 인증/인증과 관련하여 아이폰 애플리케이션에 문제가 있습니다.우리는 UI WebView 컨트롤을 사용하는 간단한 iPhone 앱을 개발했습니다.이 단계에서는 앱이 수행하는 모든 기능이 ASP로 이동합니다.인터넷 웹사이트.간단하죠?문제는 사용자가 로그인 페이지를 통과할 수 없다는 것입니다.재실행 단계는 다음과 같습니다.

  • 아이폰 앱을 엽니다.
  • 앱이 홈 페이지로 이동합니다.
  • 사용자가 인증되지 않아 로그인 화면/페이지로 리디렉션됩니다.
  • 사용자가 올바른 사용자 이름과 암호를 입력하면 제출을 클릭합니다.
  • 서버 측에서는 사용자가 인증되고 쿠키가 생성되어 양식을 사용하여 클라이언트로 전송됩니다.인증.GetAuthCookie.
  • 서버는 사용자를 올바른 홈 페이지로 보내기 위해 리디렉션을 보냅니다.

그러나 사용자는 로그인 화면으로 다시 리디렉션됩니다!

이에 대해 광범위한 디버깅을 수행했으며, 제가 알고 있는 것은 다음과 같습니다.

쿠키가 클라이언트로 전송되고 클라이언트가 쿠키를 저장합니다.iPhone 디버거에서 그리고 페이지에 쿠키 데이터를 표시하기 위해 Javascript를 사용하여 이것을 확인했습니다.쿠키를 서버로 다시 보내는 중입니다.Visual Studio 디버거에서 확인했습니다.올바른 쿠키입니다(설정된 쿠키와 동일).사용자 속성입니다.신원.IsAuthenticated는 인증 쿠키가 Request 개체에 포함되어 있더라도 어떤 이유에서 false를 반환합니다.나는 아이폰 앱이 쿠키를 받아들이도록 설정되어 있고, 그것들이 클라이언트에 있다는 것을 확인했습니다.

여기 재미있는 것이 있습니다.당신이 아이폰에서 사파리 브라우저를 열고 우리 사이트로 직접 가면 됩니다.

iPad에서도 로그인 화면을 통과하지 못한다는 점에서 동일한 동작을 합니다.이것은 에뮬레이터와 장치를 비난합니다.

이 웹 사이트는 IE 7-8, Safari(Windows용), Blackberry, IEMobile 6.5, Phone 7에서 테스트되었으며 작동합니다.아이폰 앱의 UI 웹 뷰가 작동하지 않는 유일한 상황입니다.

정확히 같은 문제가 있었지만 다른 장치(Nokia N8)에 문제가 있었고 사용자 에이전트까지 문제를 추적했습니다.

IIS는 정규식을 사용하여 사용자 에이전트 문자열과 일치시킵니다.문제의 근본 원인은 특정 장치에 대해 일치하는 정규식이 없고 기본 속성이 사용되는 가장 낮은 일치 수준 중 하나로 끝났다는 것입니다.기본 속성에서 브라우저가 쿠키를 지원하지 않습니다.

솔루션:

  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>

추가 정보: 브라우저 정의 파일 스키마

우리가 찾은 솔루션은 파일(generic.browser)을 만들고 이 xml을 포함하여 웹 서버에 "Mozilla" 및 기본 브라우저 설정이 모두 쿠키를 지원해야 한다는 것을 알리는 것이었습니다.

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

이 문제는 ASP.NET 4.5에서 해결되었으며 모든 브라우저가 쿠키를 지원하는 것으로 간주되므로 추가 .browser 파일이 필요하지 않습니다.

제가 조사한 바에 따르면, 사용자 에이전트를 설정할 수 없는 이유는 UI WebView가 요청을 보내기 직전, 즉 사용자가 코드에서 요청을 보낸 후 사용자 에이전트 값을 설정하고 있기 때문입니다.

이 문제를 해결하는 비결은 "method swizzling"이라고 불리는 것을 사용하는 것입니다. 이 개념은 표준 방법을 제공하는 것과 교체하는 진보되고 잠재적으로 위험한 Objective-C 개념입니다.결과적으로 요청이 전송되고 프레임워크 코드가 User-Agent를 추가하면 사용자가 제공한 방법을 사용하도록 속게 됩니다.

다음은 제가 이를 구현하기 위해 무엇을 했는지 설명하지만 저는 Objective-C 전문가가 아니므로 기술에 익숙해지기 위해 몇 가지 연구를 수행할 것을 제안합니다.특히 여기서 무슨 일이 일어나고 있는지 저보다 더 잘 설명해주는 링크가 있었는데, 지금은 찾을 수가 없습니다.

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

하위 클래스 NSMutable스위즐을 허용하는 URL 요청:

@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

정적 메서드를 호출하여 메서드를 전환합니다.옵션으로 시작 완료에서 이 전화를 걸었습니다.

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

그런 다음 이렇게 사용했습니다. (연결 대리자는 데이터를 가변 배열에 저장한 다음 로드가 완료되면 loadData 메서드를 사용하여 UIWebView를 수동으로 설정합니다.)

- (void)loadWithURLString:(NSString*)urlString
{
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
_connection = [NSURLConnection connectionWithRequest:request delegate:self];
[_connection start];
}
  1. 마크업에 DestinationPageUrl을 지정했습니까?

  2. 기본값을 지정했습니까?web.config의 URL?

web.config 예제

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

대상 페이지 URL 예제

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

마지막으로 쿠키통을 들여다보고 세션 쿠키가 실제로 존재하는지 확인해 보셨습니까?

UI WebView의 쿠키는 어디에 저장됩니까?

이러한 현상이 발생하는 이유는 사용자 에이전트를 알 수 없는 경우 브라우저가 쿠키를 허용하지 않는 것으로 가정하고(다른 사용자가 응답한 것처럼) 대신 IIS가 URL에 ASPXAUTH 값을 입력하기 때문인 것으로 보입니다.

하지만 MVC 라우팅 시스템은 분명히 그 가능성을 놓쳤고, 이것은 분명히 버그이며, 따라서 그것은 엉망이 되고 있습니다.

사용자 지정 사용자 에이전트와 함께 .browser를 추가하면 문제가 해결되지만, 다른 사용자 에이전트도 해결된다는 보장은 없으며, 실제로 안드로이드용 K9 브라우저에도 이러한 문제가 있다는 것을 알게 되었고, 따라서 이러한 오류를 추적할 수 있는 elmeh와 같은 로깅 시스템이 있어야만 해결할 수 있습니다.

반면에 기본값을 추가하면 모든 브라우저가 쿠키를 허용하는 것이 사실인지 여부에 대한 의문이 제기됩니다. 이것이 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
        );

그러나 이 경우 사용자 지정 경로 핸들러를 작성하려는 경우가 아니면 쿠키가 없는 상황과 일치하도록 모든 경로 항목을 복사해야 합니다.

또는 위의 쿠키 없는 경로를 사용하여 브라우저가 현재 지원되지 않음을 설명하는 오류 페이지로 사용자를 보내고 사용자 에이전트와 함께 웹 마스터에 경고를 보내 처리할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4158550/asp-net-forms-authentication-when-using-iphone-uiwebview

반응형