2015-02-05 18 views
10

Tôi đã thực hiện xác thực OAuth trong dự án Api Web của tôi dựa on these blog postsSử dụng cả hai OAuth và Basic Auth trong Asp.Net Web Api với Owin

Nó hoạt động tốt, bao gồm làm mới Logic token.

Tôi muốn thêm tùy chọn để xác thực cơ bản cũng như cho một vài cuộc gọi cho công việc đã lên lịch.

Tôi đã thử thêm giải pháp Cơ bản xác thực làm phần mềm trung gian nhưng tôi vẫn nhận được 401 yêu cầu mã thông báo Bearer.

Tôi có thể làm cho thiết bị hoạt động bằng cách xóa thuộc tính [Ủy quyền] khỏi các cuộc gọi api đó và kiểm tra thủ công bằng mã nếu người dùng được xác thực nhưng có vẻ như không đúng cách để giải quyết.

Có cách nào để hỗ trợ cả Xác thực cơ bản và xác thực OAuth bằng OWin không?

Trả lời

7

Làm thế nào về bạn thuộc tính hành động hay điều khiển của bạn với bạn muốn thực hiện xác thực Basic với các thuộc tính [OverrideAuthentication] Sau đó, bạn tạo thuộc tính lọc xác thực tùy chỉnh mà thừa hưởng từ Attribute, IAuthenticationFilter như mã dưới đây

public class BasicAuthenticationAttribute : Attribute, IAuthenticationFilter 
{ 
    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     var req = context.Request; 
     // Get credential from the Authorization header 
     //(if present) and authenticate 
     if (req.Headers.Authorization != null && "basic".Equals(req.Headers.Authorization.Scheme, StringComparison.OrdinalIgnoreCase)) 
     { 
      var rawCreds = req.Headers.Authorization.Parameter; 

      var credArray = GetCredentials(rawCreds); 

      var clientId = credArray[0]; 
      var secret = credArray[1]; 

      if (ValidCredentials(clientId, secret)) 
      { 
       var claims = new List<Claim>() 
         { 
         new Claim(ClaimTypes.Name, clientId) 
         }; 

       var identity = new ClaimsIdentity(claims, "Basic"); 
       var principal = new ClaimsPrincipal(new[] { identity }); 
       // The request message contains valid credential 
       context.Principal = principal; 
      } 
      else 
      { 
       context.ErrorResult = new UnauthorizedResult(new AuthenticationHeaderValue[0], context.Request); 
      } 

     } 
     else 
     { 
      context.ErrorResult = new UnauthorizedResult(new AuthenticationHeaderValue[0], context.Request); 
     } 

     return Task.FromResult(0); 
    } 

    private string[] GetCredentials(string rawCred) 
    { 

     var encoding = Encoding.GetEncoding("UTF-8"); 

     var cred = encoding.GetString(Convert.FromBase64String(rawCred)); 

     var credArray = cred.Split(':'); 

     if (credArray.Length == 2) 
     { 
      return credArray; 
     } 
     else 
     { 
      return credArray = ":".Split(':'); 
     } 

    } 

    private bool ValidCredentials(string clientId, string secret) 
    { 

     //compare the values from web.config 

     if (clientId == secret) 
     { 
      return true; 
     } 
     return false; 
    } 

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context,CancellationToken cancellationToken) 
    { 
     context.Result = new ResultWithChallenge(context.Result); 
     return Task.FromResult(0); 
    } 

    public class ResultWithChallenge : IHttpActionResult 
    { 
     private readonly IHttpActionResult next; 
     public ResultWithChallenge(IHttpActionResult next) 
     { 
      this.next = next; 
     } 
     public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
     { 
      var response = await next.ExecuteAsync(cancellationToken); 
      if (response.StatusCode == HttpStatusCode.Unauthorized) 
      { 
       response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Basic")); 
      } 
      return response; 
     } 
    } 

    public bool AllowMultiple 
    { 
     get { return false; } 
    } 
} 

Bây giờ bạn sử dụng nó để phân bổ các bộ điều khiển hoặc hành động của bạn dưới dạng mã bên dưới:

[OverrideAuthentication] 
    [BasicAuthentication] 
    [Route("")] 
    public async Task<IHttpActionResult> Get() 
{ 
} 

Lưu ý cách chúng tôi tạo danh tính xác nhận quyền sở hữu và đặt giao thức Xác thực thành Cơ bản, bạn có thể t bất kỳ tuyên bố nào bạn muốn ở đây.

+0

Tôi đã sử dụng các bộ lọc để xác thực tùy chỉnh trong các dự án trước, tôi đoán một vài cuộc gọi trong API chủ yếu sử dụng các lược đồ xác thực khác có ý nghĩa hơn một phần mềm trung gian Owin thực hiện trên mọi cuộc gọi tìm tiêu đề cơ bản – EShy

Các vấn đề liên quan