Как настроить принципала в EmbedIO с токеном на предъявителя и модулями API - PullRequest
0 голосов
/ 14 января 2020

Я использую модуль Bearer Token для защиты модуля API.

Как я могу получить свойство IHttpContext.User для текущего пользователя, чтобы я мог получить к нему доступ в моих контроллерах?

Вот соответствующая часть настройки веб-сервера:

WebServerEmbedded
    .WithCors()
    .WithBearerToken("/api", "0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9eyJjbGF", new MyAuthorizationServerProvider())
    .WithModule(webApiModule)

, а вот MyAuthorizationServerProvider:

internal sealed class MyAuthorizationServerProvider: IAuthorizationServerProvider
{
    public async Task ValidateClientAuthentication(ValidateClientAuthenticationContext context)
    {
        var data = await context.HttpContext.GetRequestFormDataAsync().ConfigureAwait(false);

        if (data?.ContainsKey("grant_type") == true && data["grant_type"] == "password")
        {
            var username = data.ContainsKey("username") ? data["username"] : string.Empty;
            var password = data.ContainsKey("password") ? data["password"] : string.Empty;

            if (ValidateCredentials(username, password))
            {
                context.Validated(username);
            }
            else
            {
                context.Rejected();
            }
        }
        else
        {
            context.Rejected();
        }
    }

    public long GetExpirationDate() => DateTime.UtcNow.AddHours(12).Ticks;

    private static bool ValidateCredentials(string username, string password)
    {
        var user = BusinessLayer.CheckUserAndPassword(username, password);
        return user != null;
    }
}

Спасибо.

1 Ответ

0 голосов
/ 17 января 2020

Я разместил выпуск в репозитории embedio-extras, и был создан запрос на получение , который решает его. Как подробно описано здесь, при обновлении до Embedio (v3.3.3) и Embbedio.BearerToken (v3.4.0) устанавливается принципал User из модуля токена Bearer.

В контроллерах HttpContext.User можно использовать для доступа к главный. Дополнительные претензии могут быть включены в реализацию IAuthorizationServerProvider, непосредственно перед вызовом context.Validated(username);, например:

context.Identity.AddClaim(new System.Security.Claims.Claim("Role", "Admin"));
context.Validated(username);

К заявкам можно обращаться следующим образом в контроллере:

var principal = HttpContext?.User as ClaimsPrincipal;
if (null != principal)
{
    foreach (Claim claim in principal.Claims)
    {
        Log("Claim type: " + claim.Type + "; Claim value: " + claim.Value);
    }
}
...