Question

I am would like to add errors or exception, which can show up on the cliet-side, when the user leaves the username/password blank or press 'cancel' on the login dialog. Currently, it shows a blank screen to those exception.

public class BasicAuthHandler : DelegatingHandler
 {
    private const string BasicAuthResponseHeader = "WWW-Authenticate";
    private const string BasicAuthResponseHeaderValue = "Basic";

    public BasicAuthHandler(iUser repository)
    {
        this.repository = repository;
    }

    [Inject]
    iUser repository { get; set; }


    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        AuthenticationHeaderValue authValue = request.Headers.Authorization;


        if (authValue == null || authValue.Scheme != BasicAuthResponseHeaderValue)
        {
            return Unauthorized(request);
        }
        string[] credentials = Encoding.ASCII.GetString(Convert.FromBase64String(authValue.Parameter)).Split(new[] { ':' });
        if (credentials.Length != 2 || string.IsNullOrEmpty(credentials[0]) || string.IsNullOrEmpty(credentials[1]))
        {
            return Unauthorized(request);

        }
        api_login user = repository.Validate2(credentials[0], credentials[1]);
        if (user == null)
        {
            return Unauthorized(request);
        }
        string[] roles = new[] { "Users", "Testers" };
        IPrincipal principal = new GenericPrincipal(new GenericIdentity(user.username, BasicAuthResponseHeaderValue), roles);
        Thread.CurrentPrincipal = principal;
        HttpContext.Current.User = principal;

        return base.SendAsync(request, cancellationToken);
    }

    private Task<HttpResponseMessage> Unauthorized(HttpRequestMessage request)
    {
        var response = request.CreateResponse(HttpStatusCode.Unauthorized);
        response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue);
        var task = new TaskCompletionSource<HttpResponseMessage>();
        task.SetResult(response);
        return task.Task;
    }

    private api_login ParseAuthorizationHeader(string authHeader)
    {
        string[] credentials = Encoding.ASCII.GetString(Convert.FromBase64String(authHeader)).Split(new[] { ':' });
        if (credentials.Length != 2 || string.IsNullOrEmpty(credentials[0]) || string.IsNullOrEmpty(credentials[1])) return null;

        return new api_login()
        {
            username = credentials[0],
            password = credentials[1],
        };
    }

Updated error code:

 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        AuthenticationHeaderValue authValue = request.Headers.Authorization;

        if (authValue == null || authValue.Scheme != BasicAuthResponseHeaderValue)
        {
            return Unauthorized(request);
        }

        string[] credentials = Encoding.ASCII.GetString(Convert.FromBase64String(authValue.Parameter)).Split(new[] { ':' });
        if (credentials.Length != 2 || string.IsNullOrEmpty(credentials[0]) || string.IsNullOrEmpty(credentials[1]))
        {
           //return Unauthorized(request);
           var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
           {
               Content = new StringContent(string.Format("access denied")),
           };
        }

        api_login user = repository.auth(credentials[0], credentials[1]);
        if (user == null)
        {
           //return Unauthorized(request);
           //return request.CreateErrorResponse(HttpStatusCode.NotFound, "If not member, please sign in using:");
           var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
           {
               Content = new StringContent(string.Format("access denied")),
           };

        }

        var roles = repository.GetRolesForUser(user.username);
        IPrincipal principal = new GenericPrincipal(new GenericIdentity(user.username, BasicAuthResponseHeaderValue), roles);
        Thread.CurrentPrincipal = principal;
        HttpContext.Current.User = principal;

        return base.SendAsync(request, cancellationToken)
        .ContinueWith(task =>
       {
           var response = task.Result;

           if (response.StatusCode == HttpStatusCode.Unauthorized
               && !response.Headers.Contains(BasicAuthResponseHeader))
           {
               // redirect to some log in page?
               var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
               {
                   Content = new StringContent(string.Format("access denied")),
               };
           }
           return response;
       });
    }

I am not sure on the right approach to go about adding exception to the code, I have added couple of error codes in the code above but whenever i press cancel on login dialog, it goes to blank screen instead of showing the following error messages.

Any help would be very much appreciated. Thank you

No correct solution

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top