Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 使用无身份承载/Jwt授权_Asp.net Web Api_Asp.net Core_Jwt - Fatal编程技术网

Asp.net web api 使用无身份承载/Jwt授权

Asp.net web api 使用无身份承载/Jwt授权,asp.net-web-api,asp.net-core,jwt,Asp.net Web Api,Asp.net Core,Jwt,我正在用Asp 5开发一个Web API,阅读一些关于Web API的文档,我意识到我需要授权 搜索后,我找不到任何未经Aspnet.Identity授权的文档或样本。我有自己的会员资格,我不想使用Identity 我应该使用Identity库吗?或者是否有一种方法可以在我的会员资格中实现授权 一个小问题: 如果我被迫使用Identity,我如何才能将EntityFramework更改为类似dapper或ADO.NET的内容,以用于我的DBContext?已经有了一个,您只需要编写一些发布承载令

我正在用Asp 5开发一个Web API,阅读一些关于Web API的文档,我意识到我需要授权

搜索后,我找不到任何未经
Aspnet.Identity
授权的文档或样本。我有自己的会员资格,我不想使用
Identity

我应该使用
Identity
库吗?或者是否有一种方法可以在我的会员资格中实现授权

一个小问题:
如果我被迫使用Identity,我如何才能将EntityFramework更改为类似dapper或ADO.NET的内容,以用于我的
DBContext

已经有了一个,您只需要编写一些发布承载令牌的内容。这有点复杂,取决于你使用什么作为你的身份存储,当你指出这是一种定制的东西时,很难对任何方法提出建议。不过,创建JWT代币并不难

var now=DateTime.UtcNow;
//自动创建新密钥,您可能希望将其存储在某个位置
var aes=新的AESCryptServiceProvider();
var signingTokenHandler=new JwtSecurityTokenHandler();
var tokenDescriptor=新的SecurityTokenDescriptor
{
主题=新的索赔实体(
新[]
{
新声明(JwtRegisteredClaimNames.Aud,“YOURWEBSITEURL”),
TokenIssuerName=“您的网站”,
生存期=新生存期(now,now.AddHours(1)),
SigningCredentials=新的SigningCredentials(
新的InMemorySymetricSecurityKey(aes.Key),
"http://www.w3.org/2001/04/xmldsig-more#hmac-sha256“,
"http://www.w3.org/2001/04/xmlenc#sha256")
};
var token=signingTokenHandler.CreateToken(tokenDescriptor);
var tokenAsString=signingTokenHandler.WriteToken(令牌);
所有授权都不依赖于成员资格,它们将与任何身份验证中间件一起工作。授权文件中根本没有提到身份


有一个空位。您可以在源代码中看到,没有任何身份出现,它正在动态创建用户主体,然后将它们存储在cookie中。

要发行您自己的JWT令牌,您可以使用:

project.json
{
“依赖项”:{
// ...
“AspNet.Security.OAuth.Validation”:“1.0.0-*”,
“OpenIddict”:“1.0.0-*”,
“OpenIddict.EntityFrameworkCore”:“1.0.0-*”,
“OpenIddict.Mvc”:“1.0.0-*”
}
}
Startup.cs
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.AddDbContext(选项=>
{
//将上下文配置为使用内存存储。
options.UseInMemoryDatabase();
//注册OpenIddict所需的实体集。
//注意:如果需要,请使用通用重载
//替换默认的OpenIddict实体。
options.UseOpenIddict();
});
services.AddOpenIddict(选项=>
{
//注册实体框架存储。
options.AddEntityFrameworkCoreStores();
//注册OpenIddict使用的ASP.NET核心MVC绑定器。
//注意:如果不调用此方法,将无法
//绑定OpenIdConnectRequest或OpenIdConnectResponse参数。
options.AddMvcBinders();
//启用令牌端点。
options.EnableTokenEndpoint(“/connect/token”);
//启用密码流。
options.AllowPasswordFlow();
//在开发过程中,您可以禁用HTTPS要求。
选项。禁用HttpSrequirement();
});
}
公共void配置(IApplicationBuilder应用程序)
{
//注册用于解密的验证中间件
//访问令牌并填充HttpContext.User属性。
app.useAuthValidation();
//注册OpenIddict中间件。
app.UseOpenIddict();
app.UseMvcWithDefaultRoute();
}
}
授权控制器.cs
公共类授权控制器:控制器
{
[HttpPost(“~/connect/token”),生成(“应用程序/json”)]
公共IActionResult交换(OpenIdConnectRequest请求)
{
if(request.IsPasswordGrantType())
{
//验证用户凭据。
/Note:为了减轻暴力攻击,你应该强烈考虑。
//应用像PBKDF2这样的键派生函数来降低速度
/密码验证过程。您也应该考虑。
//使用时间常数比较器来防止定时攻击。
如果(request.Username!“alice@wonderland.com" ||
请求密码!“P@ssw0rd")
{
返回禁止(OpenIdConnectServerDefaults.AuthenticationScheme);
}
//创建持有用户标识的新ClaimsEntity。
var标识=新的索赔实体(
OpenIdConnectServerDefaults.AuthenticationScheme,
OpenIdConnectConstants.Claims.Name,
OpenIdConnectConstants.Claims.Role);
//添加包含用户标识符的“子”声明,并附加
//允许OpenIddict存储它的“access_令牌”目标
//在访问令牌中,以便可以从控制器中检索。
identity.AddClaim(OpenIdConnectConstants.Claims.Subject,
“71346D62-9BA5-4B6D-9ECA-755574D628D8”,
OpenIdConnectConstants.Destinations.AccessToken);
identity.AddClaim(OpenIdConnectConstants.Claims.Name,“Alice”,
OpenIdConnectConstants.Destinations.AccessToken);
//…如有必要,添加其他索赔。
var principal=新的索赔人(身份)
POST /connect/token HTTP/1.1
Host: localhost:7096
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=alice%40wonderland.com&password=P%40ssw0rd