Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Monodroid WebView Authentication for SSRS webpage

I have made two attempts in trying to access a website with authentication, and I am not sure what is wrong with my attempts. I will list each one. Has anyone tried this and gotten it to work?

This should not be difficult for Java Android programmers to understand, nor should it matter that I am using monodroid EDIT (It DOES matter, because I have a Java implementation below that works just fine)END EDIT.

I am trying to gain access to an SSRS RDL through the WebView and I need to plug in some generic credentials.

ACTIVITY:

    public static string username = "...";
    public static string password = "...";
    public static string website  = "http://10.0.0.5/Reports";

    private WebView webView;

    private void setupWebView(int attempt)
    {
        webView.Settings.JavaScriptEnabled = true;
        webView.Settings.BlockNetworkLoads = false;

        switch (attempt)
        {
            case 1:
                {
                    webView.SetHttpAuthUsernamePassword(website, "", username, password);                                              
                }break;
            case 2:
                {
                    webView.SetWebViewClient(new AuthenticationClient(this));                        
                }break;
        }
        webView.LoadUrl(website);
    }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        webView = new WebView(this);

        setupWebView(1);//1 or 2 depending on what I am testing

        // Set our view from the "main" layout resource
        SetContentView(webView);           
    }
}

AuthenticationClient:

    //DECLARED IN ANOTHER FILE
    [Android.Runtime.Register("android/webkit/WebViewClient", DoNotGenerateAcw = true)]
    public class AuthenticationClient:WebViewClient
    {
        private Context _context;

        public AuthenticationClient(Context context)
        {
            _context = context;
        }

        public override void OnReceivedError(WebView view, ClientError errorCode, string description, string failingUrl)
        {
            Toast.MakeText(_context, "OnReceivedError: " + errorCode, ToastLength.Long);
            //base.OnReceivedError(view, errorCode, description, failingUrl);
        }

        public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
        {
            Toast.MakeText(_context, "OnPageStarted: " + url, ToastLength.Long);
            //base.OnPageStarted(view, url, favicon);
        }

        public override bool ShouldOverrideUrlLoading(WebView view, string url)
        {
            Toast.MakeText(_context, "ShouldOverrideUrlLoading: " + url, ToastLength.Long);
            view.LoadUrl(url);
            return true;
        }

        public override void OnReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, string host, string realm)
        {
            Toast.MakeText(_context, "OnReceivedHttpAuthRequest: " + host, ToastLength.Long);
            handler.Proceed(Activity1.username, Activity1.password);
        }
    }
    //END DECLARATION

ATTEMPT 1: It does not even try to load the page. I keep getting an error:
chromium(18710): external/chromium/net/http/http_auth_gssapi_posix.cc:463: [0821/095922:WARNING:http_auth_gssapi_posix.cc(463)] Unable to find a compatible GSSAPI library

ATTEMPT 2: Does not show a single toast message.

I have already looked at:
http://developer.android.com/reference/android/webkit/WebView.html
Using WebView setHttpAuthUsernamePassword?
WebView.setHttpAuthUsernamePassword() not working?
Passing username and password to SSRS 2005 reports from web application

OTHER STUFF
I have now done it in Java and it works fine. I still need a Mono for Android solution:

public class Android_reporttestActivity extends Activity {
public static String username = "...";
public static String password = "...";
public static String website = "http://10.0.0.5/Reports";       

private WebView setupWebView()
{
    WebView webView = new WebView(this); 

    webView.setWebViewClient(
        new WebViewClient(){
            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
            {                           
                handler.proceed(username,password);
            }
        }
    );

    return webView;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView webview = setupWebView();

    // Set our view from the "main" layout resource
    setContentView(webview);

    webview.loadUrl(website);
}
like image 350
Quintin Balsdon Avatar asked Aug 20 '12 07:08

Quintin Balsdon


1 Answers

Running the following for me allows everything to work as expected for me:

[Activity (Label = "WebViewExample", MainLauncher = true)]
public class Activity1 : Activity
{
    string url;
    WebView mWebView;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        url = "http://awebsite.com"; 
        mWebView = (WebView)FindViewById<WebView> (Resource.Id.webview);
        mWebView.SetWebViewClient (new ViewClient (this));
        mWebView.Settings.JavaScriptEnabled = (true);
        mWebView.Settings.PluginsEnabled = (true);
        mWebView.LoadUrl (url);
    }

    class ViewClient : WebViewClient
    {
        Activity1 _activity;

        public ViewClient(Activity1 activity)
        {
            _activity = activity;   
        }

        public override void OnPageStarted (WebView view, string url, Android.Graphics.Bitmap favicon)
        {
            Console.WriteLine ("On Page Started");
        }

        public override void OnReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, string host, string realm)
        {
            Console.WriteLine ("On received Http auth request");
            handler.Proceed("username", "password");
        }

        public override bool ShouldOverrideUrlLoading (WebView view, string url)
        {
            Console.WriteLine ("Should Override Url Loading...");
            return base.ShouldOverrideUrlLoading (view, url);
        }
    }
}

The reason why your toasts aren't showing is probably because you're not calling ".Show()" on them so they are never displayed.

If you still can't get it up and running, then providing a URL we can use to hit against would be really useful.

I hope this helps,

ChrisNTR

like image 164
chrisntr Avatar answered Sep 19 '22 07:09

chrisntr