.net - .NET Framework MVC 和 Web Api Auth JWT
问题描述
我在 MVC 中有一个使用 .NET Framework v4.7 的项目,上面有一些 WebApi。我需要知道的是如何使用中间件来为 HTTP 请求和 MVC Action 请求授权 JWT。
我到处寻找解决方案示例,但找不到任何东西。
如果有人可以提供帮助,我将不胜感激。
对不起英语。
解决方案
如果我掌握了您的问题陈述,我认为OWIN可能是一种选择:您将应用程序与底层托管分离并获得一个可扩展的管道,您可以将中间件注入其中(非常像 .net core 开箱即用)。
更好的是 - 它提供了开箱即用的 JWT 支持(好吧,您需要安装一些 nuget 包 - 见下文)。然后,您只需在您的设备上启用它并使用标准属性IAppBuilder
滚动即可。[Authorize]
为了演示这个设置,我在这里整理了一个有效的 GitHub存储库来说明 WebApi 中间件。
除了Microsoft.AspNet.WebApi.Owin
,Microsoft.Owin.Host.SystemWeb
和Microsoft.Owin.Security.Jwt
nuget 包之外,它几乎是一个标准的 asp.net WebApi 项目,更改了以下文件:
/启动.cs
using System.Text;
using System.Web.Http;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Jwt;
using Owin;
namespace OWIN.WebApi
{
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config); // bootstrap your existing WebApi config
appBuilder.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true, // I guess you don't even have to sign the token
ValidIssuer = "http://localhost",
ValidAudience = "http://localhost",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("jwt_signing_secret_key"))
}
});
appBuilder.UseWebApi(config); // instruct OWIN to take over
}
}
}
/控制器/ProtectedValuesController.cs
using System.Collections.Generic;
using System.Web.Http;
namespace OWIN.WebApi.Controllers
{
[Authorize]
public class ProtectedValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
}
/Controllers/ObtainJwtController.cs
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Text;
using System.Web.Http;
using Microsoft.IdentityModel.Tokens;
using Claim = System.Security.Claims.Claim;
namespace OWIN.WebApi.Controllers
{
// this class is literally just a test harness to help me generate a valid token for popping into Postman.
public class ObtainJwtController: ApiController
{
private string CraftJwt()
{
string key = "jwt_signing_secret_key"; //Secret key which will be used later during validation
var issuer = "http://localhost";
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var permClaims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim("valid", "1"),
new Claim("userid", "1"),
new Claim("name", "test")
};
var token = new JwtSecurityToken(issuer,
issuer,
permClaims,
expires: DateTime.Now.AddDays(1),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
public string Get()
{
return $"Bearer {CraftJwt()}";
}
}
}
这似乎也适用于 MVC
我添加了一些额外的 nuget 包来处理ASP.NET Identity,这似乎使我能够成功地保护以下控制器:
/控制器/Home.cs
using System.Web.Mvc;
namespace OWIN.WebApi.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Title = "Home Page";
return View();
}
[Authorize]
public ActionResult Protected()
{
return View();
}
}
}
希望这能给你一些探索的选择
推荐阅读
- reactjs - React-Bootstrap 中的“TypeError:_camelize.default 不是函数”
- power-bi-report-server - 从 power bi 导出 excel 文件而不减少数据大小
- python - 基于现有列创建具有范围的新列
- python - 如何在基于字典的数据框上的组内进行自定义排序?
- docker - 在 docker 容器中部署时,身份验证重定向 uri 使用 http 而不是 https
- python - 如何使用 Python Dash 绘制自己的地图?
- statistics - 如何在Stata中使用前几年的数据填写观察结果?(面板数据)
- linux - 禁用特定用户的文件和文件夹删除权限
- javascript - 你如何将 django 对象发送到 javascript 代码?
- hadoop - Pentaho - 连接到 apache hive