Asp.net core 将声明从WebApp传递到API
我正在开发一个web应用程序,希望将一些自定义声明传递给API。我有以下代码来设置用户声明并调用API。我希望在API中访问此声明,但它没有发生。有人能帮忙吗?我们如何将声明和其他身份信息从web应用程序传递到APIAsp.net core 将声明从WebApp传递到API,asp.net-core,asp.net-web-api,claims-based-identity,claims,Asp.net Core,Asp.net Web Api,Claims Based Identity,Claims,我正在开发一个web应用程序,希望将一些自定义声明传递给API。我有以下代码来设置用户声明并调用API。我希望在API中访问此声明,但它没有发生。有人能帮忙吗?我们如何将声明和其他身份信息从web应用程序传递到API public async Task<IActionResult> Privacy3() { SetClaim("db2"); var httpClient = _clientFac
public async Task<IActionResult> Privacy3()
{
SetClaim("db2");
var httpClient = _clientFactory.CreateClient("NewApi");
var api = new HttpRequestMessage(HttpMethod.Get, "/api/customer");
var response = await httpClient.SendAsync(api);
if (response.IsSuccessStatusCode)
{
using var responseStream = await response.Content.ReadAsStreamAsync();
var data = await JsonSerializer.DeserializeAsync<IEnumerable<Customer>>(responseStream, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
return View(data);
}
else
{
return View();
}
}
private ClaimsPrincipal SetClaim(string id)
{
if (id == null || id == "")
{
id = "db1";
}
ClaimsPrincipal principal = HttpContext.User;
var identity = (ClaimsIdentity)principal.Identity;
identity.AddClaim(new Claim("db", id));
return principal;
}
public异步任务Privacy3()
{
SetClaim(“db2”);
var httpClient=_clientFactory.CreateClient(“NewApi”);
var api=新的HttpRequestMessage(HttpMethod.Get,“/api/customer”);
var response=wait-httpClient.SendAsync(api);
if(响应。IsSuccessStatusCode)
{
使用var responseStream=wait response.Content.ReadAsStreamAsync();
var data=await JsonSerializer.DeserializeAsync(responseStream,new JsonSerializerOptions(){propertynamecasensitive=true});
返回视图(数据);
}
其他的
{
返回视图();
}
}
private ClaimsPrincipal SetClaim(字符串id)
{
如果(id==null | | id==“”)
{
id=“db1”;
}
ClaimsPrincipal principal=HttpContext.User;
var identity=(ClaimsIdentity)principal.identity;
identity.AddClaim(新索赔(“db”,id));
返还本金;
}
我的API代码如下所示
public void ConfigureServices(IServiceCollection services)
{
//From Mr Browne
services.AddControllers();
services.AddHttpContextAccessor();
services.AddDbContext<CustomerDataContext>((sp, options) =>
{
var requestContext = sp.GetRequiredService<IHttpContextAccessor>().HttpContext;
var constr = GetConnectionStringFromRequestContext(requestContext);
options.UseSqlServer(constr, o => o.UseRelationalNulls());
});
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "AspNetCoreEfTest", Version = "v1" });
});
}
private string GetConnectionStringFromRequestContext(HttpContext requestContext)
{
var host = requestContext.User;
var dbname = "AspNetCoreEfTest";
if (host.Claims.Count(e => e.Type == "db") > 0)
{
var db = host.Claims.FirstOrDefault(e => e.Type == "db").Value;
if (db == "db1")
{
dbname = "AspNetCoreEfTest";
}
else if (db == "db2")
{
dbname = "AspNetCoreEfTestTwo";
}
}
return "Server=(localdb)\\mssqllocaldb;Database=" + dbname + ";Integrated Security=true";
}
public void配置服务(IServiceCollection服务)
{
//来自布朗先生
services.AddControllers();
AddHttpContextAccessor();
services.AddDbContext((sp,选项)=>
{
var requestContext=sp.GetRequiredService().HttpContext;
var constr=GetConnectionStringFromRequestContext(requestContext);
options.UseSqlServer(constr,o=>o.UserRelationalNulls());
});
services.AddSwaggerGen(c=>
{
c、 SwaggerDoc(“v1”,新OpenApiInfo{Title=“AspNetCoreEfTest”,Version=“v1”});
});
}
私有字符串GetConnectionStringFromRequestContext(HttpContext requestContext)
{
var host=requestContext.User;
var dbname=“AspNetCoreEfTest”;
if(host.Claims.Count(e=>e.Type==“db”)>0)
{
var db=host.Claims.FirstOrDefault(e=>e.Type==“db”).Value;
如果(db==“db1”)
{
dbname=“AspNetCoreEfTest”;
}
else if(db==“db2”)
{
dbname=“AspNetCoreEfTestTwo”;
}
}
返回“Server=(localdb)\\mssqllocaldb;Database=“+dbname+”;integratedsecurity=true”;
}
你试过这个吗?嗨,蒂莎,谢谢你的链接。我试试看。你有没有没有没有识别服务器。这是一项付费服务,每年12000美元