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