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

没有正确的解决方案

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top