Ответ 1
Чтобы быть ясным, образец, который я упомянул в указанной вами ссылке, может использоваться с любым клиентом OAuth2, используя любой поддерживаемый поток (неявный, код или пользовательский). При общении с вашим собственным сервером авторизации вы, конечно, можете использовать неявный поток, если хотите использовать JS или мобильные приложения: вам просто нужно создать запрос авторизации с помощью response_type=token
и извлечь токен доступа из фрагмента URI в JS сторона.
Для справки, здесь образец: https://github.com/aspnet-security/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Mvc/Mvc.Server
В случае, если вы предпочитаете более простой подход (в котором не будет никакого настраиваемого сервера авторизации OAuth2), здесь еще один вариант с использованием промежуточного программного обеспечения для идентификации на предъявителя OAuth2 и реализация пользовательского IAuthenticationTokenProvider
для ручной проверки непрозрачного токена, выпущенного Dropbox. В отличие от упомянутого примера (который действует как прокси-сервер авторизации между Dropbox и клиентским приложением MVC), приложение JS напрямую зарегистрировано в Dropbox.
Вам нужно будет сделать запрос против конечной точки профиля Dropbox (https://api.dropbox.com/1/account/info) с принятым токеном, чтобы проверить его и построить адекватный экземпляр ClaimsIdentity
для каждого запроса, полученного вашим API. Здесь образец (но, пожалуйста, не используйте его как есть, он не был протестирован):
public sealed class DropboxAccessTokenProvider : AuthenticationTokenProvider {
public override async Task ReceiveAsync(AuthenticationTokenReceiveContext context) {
using (var client = new HttpClient()) {
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.dropbox.com/1/account/info");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.Token);
var response = await client.SendAsync(request);
if (response.StatusCode != HttpStatusCode.OK) {
return;
}
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
var identity = new ClaimsIdentity("Dropbox");
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, payload.Value<string>("uid")));
context.SetTicket(new AuthenticationTicket(identity, new AuthenticationProperties()));
}
}
}
Вы можете легко подключить его через свойство AccessTokenProvider
:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions {
AccessTokenProvider = new DropboxAccessTokenProvider()
});
У этого есть свои собственные недостатки: он требует кэширования, чтобы избежать наводнения конечной точки Dropbox и не является правильным способом, если вы хотите принимать токены, выпущенные разными провайдерами (например, Dropbox, Microsoft, Google, Facebook).
Не говоря уже о том, что если вы предлагаете очень низкий уровень безопасности: поскольку вы не можете проверить аудиторию токена доступа (то есть участника, на который был выдан токен), вы не можете обеспечить что токен доступа был выдан клиентскому приложению, которому вы полностью доверяете, что позволяет любому стороннему разработчику использовать свои собственные токены Dropbox с вашим API без запроса согласия пользователя.
Это, очевидно, серьезная проблема безопасности, и почему вы СЛЕДУЕТ предпочитаете подход, используемый в связанном образце. Вы можете больше узнать о путаных замещениях в этой теме: fooobar.com/info/83060/....
Удачи, и не стесняйтесь, если вам все еще нужна помощь.