2017-01-16 22:02:12 -05:00
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
2017-12-04 10:59:07 -05:00
|
|
|
|
namespace Bit.Core.IdentityServer
|
2017-01-16 22:02:12 -05:00
|
|
|
|
{
|
|
|
|
|
|
public static class TokenRetrieval
|
|
|
|
|
|
{
|
2017-10-17 08:54:49 -04:00
|
|
|
|
public static Func<HttpRequest, string> FromAuthorizationHeaderOrQueryString(string[] authHeaderSchemes)
|
2017-01-16 22:02:12 -05:00
|
|
|
|
{
|
|
|
|
|
|
return (request) =>
|
|
|
|
|
|
{
|
2017-09-14 10:11:48 -04:00
|
|
|
|
var authorization = request.Headers["Authorization"].FirstOrDefault();
|
2017-01-16 22:02:12 -05:00
|
|
|
|
|
|
|
|
|
|
if(string.IsNullOrWhiteSpace(authorization))
|
|
|
|
|
|
{
|
2017-09-14 10:11:48 -04:00
|
|
|
|
// Bearer token could exist in the 'Content-Language' header on clients that want to avoid pre-flights.
|
|
|
|
|
|
var languageAuth = request.Headers["Content-Language"].FirstOrDefault();
|
|
|
|
|
|
if(string.IsNullOrWhiteSpace(languageAuth) ||
|
2017-10-17 08:54:49 -04:00
|
|
|
|
!languageAuth.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
|
2017-09-14 10:11:48 -04:00
|
|
|
|
{
|
2017-10-17 08:54:49 -04:00
|
|
|
|
return request.Query["access_token"].FirstOrDefault();
|
2017-09-14 10:11:48 -04:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
authorization = languageAuth.Split(',')[0];
|
|
|
|
|
|
}
|
2017-01-16 22:02:12 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-17 08:54:49 -04:00
|
|
|
|
foreach(var headerScheme in authHeaderSchemes)
|
2017-01-16 22:02:12 -05:00
|
|
|
|
{
|
2017-10-17 08:54:49 -04:00
|
|
|
|
if(authorization.StartsWith($"{headerScheme} ", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
|
{
|
|
|
|
|
|
return authorization.Substring(headerScheme.Length + 1).Trim();
|
|
|
|
|
|
}
|
2017-01-16 22:02:12 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|