C# 如何使用承载令牌和API模块在Embeditio中设置主体

C# 如何使用承载令牌和API模块在Embeditio中设置主体,c#,embedio,C#,Embedio,我正在使用来保护API模块 如何将IHttpContext.User属性设置为当前用户,以便在控制器中访问它 以下是web服务器设置的相关部分: WebServerEmbedded .WithCors() .WithBearerToken("/api", "0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9eyJjbGF", new MyAuthorizationServerProvider()) .WithModule(webApiModule) 下

我正在使用来保护API模块

如何将IHttpContext.User属性设置为当前用户,以便在控制器中访问它

以下是web服务器设置的相关部分:

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;
    }
}
谢谢。

我在embedio extras回购中发布了一个,并创建了一个解决方案。如文中所述,升级到Embedio(v3.3.3)和Embbedio.BearerToken(v3.4.0)将从承载令牌模块设置用户主体

在控制器HttpContext.User中,可以使用该用户访问主体。在调用
context.Validated(username)之前,IAAuthorizationServerProvider实现中可能会包含其他声明,例如:

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);
    }
}