我试图实现基于令牌的身份验证,但无法弄清楚如何在我的情况下使用新的Security System . 我经历了examples,但他们没有帮助我,他们正在使用cookie身份验证或外部身份验证(GitHub,Microsoft,Twitter) .
我的场景是什么:angularjs应用程序应该请求 /token
url传递用户名和密码 . WebApi应该授权用户并返回 access_token
,这将由angularjs app在以下请求中使用 .
我发现了很好的文章,关于在当前版本的ASP.NET中实现我需要的东西 - Token Based Authentication using ASP.NET Web API 2, Owin, and Identity . 但对我来说,如何在ASP.NET Core中做同样的事情并不明显 .
我的问题是:如何配置ASP.NET Core WebApi应用程序以使用基于令牌的身份验证?
4 回答
您可以查看OpenId连接示例,它们说明了如何处理不同的身份验证机制,包括JWT令牌:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
如果您查看Cordova后端项目,API的配置如下:
/Providers/AuthorizationProvider.cs中的逻辑和该项目的RessourceController也值得一看;) .
或者,您也可以使用以下代码验证令牌(还有一个片段可以使其与signalR一起使用):
要发布令牌,您可以使用openId Connect服务器包,如下所示:
编辑:我使用Aurelia前端框架和ASP.NET核心实现了一个基于令牌的身份验证实现的单页面应用程序 . 还有一个信号R持久连接 . 但是我没有做过任何数据库实现 . 代码可以在这里看到:https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
希望这可以帮助,
最好,
亚历克斯
已针对.Net Core 2进行了更新:
此答案的先前版本使用RSA;它's really not necessary if your same code that is generating the tokens is also verifying the tokens. However, if you'重新分配责任,你可能仍然希望使用
Microsoft.IdentityModel.Tokens.RsaSecurityKey
的实例 .ConfigureServices
. 我们'll use dependency injection later to access these settings. I'假设您的authenticationConfiguration
是ConfigurationSection
或Configuration
对象,以便您可以使用不同的配置进行调试和 生产环境 . 确保您安全地存放钥匙!它可以是任何字符串 .我见过其他答案会改变其他设置,例如
ClockSkew
;设置默认值,使其适用于时钟不完全同步的分布式环境 . 这些是您需要更改的唯一设置 .User
信息的任何中间件之前使用此行,例如app.UseMvc()
.请注意,这不会导致您的令牌与
SignInManager
或其他任何内容一起发出 . 您需要提供自己的输出JWT的机制 - 见下文 .AuthorizationPolicy
. 这将允许您指定仅允许使用[Authorize("Bearer")]
进行身份验证的承载令牌的控制器和操作 .然后,在您需要令牌的控制器中,如下所示:
在这里,我假设你已经有了校长 . 如果您正在使用Identity,则可以使用IUserClaimsPrincipalFactory<>将
User
转换为ClaimsPrincipal
.To test it :获取一个令牌,将其放在jwt.io的表单中 . 我上面提供的说明还允许您使用配置中的秘密来验证签名!
如果您在HTML页面上的部分视图中与.Net 4.5中的仅承载身份验证一起呈现此内容,您现在可以使用
ViewComponent
执行相同操作 . 它与上面的Controller Action代码大致相同 .在Matt Dekrey's fabulous answer工作,我创建了一个基于令牌的身份验证的完整工作示例,针对ASP.NET Core(1.0.1) . 你可以找到完整的代码in this repository on GitHub(1.0.0-rc1,beta8,beta7的替代分支),但简而言之,重要的步骤是:
Generate a key for your application
在我的示例中,每次应用程序启动时,我都会生成一个随机密钥,您需要生成一个并将其存储在某个位置并将其提供给您的应用程序 . See this file for how I'm generating a random key and how you might import it from a .json file . 正如@kspearrin的评论中所建议的那样,Data Protection API似乎是管理密钥"correctly"的理想候选者,但我还是可能的 . 如果您解决了,请提交拉取请求!
Startup.cs - ConfigureServices
在这里,我们需要为我们的令牌加载私钥,我们还将使用它来验证令牌 . 我们将密钥存储在类级变量
key
中,我们将在下面的Configure方法中重复使用它 . TokenAuthOptions是一个简单的类,它包含我们在TokenController中创建密钥所需的签名标识,受众和发布者 .我们还设置了授权策略,允许我们在我们希望保护的 endpoints 和类上使用
[Authorize("Bearer")]
.Startup.cs - Configure
在这里,我们需要配置JwtBearerAuthentication:
TokenController
在令牌控制器中,您需要有一个方法来使用Startup.cs中加载的密钥生成签名密钥 . 我们在Startup中注册了一个TokenAuthOptions实例,所以我们需要在TokenController的构造函数中注入它:
然后,您需要在处理程序中为登录 endpoints 生成令牌,在我的示例中,我使用用户名和密码并使用if语句验证这些令牌,但您需要做的关键是创建或加载声明基于身份并生成令牌:
这应该是它 . 只需将
[Authorize("Bearer")]
添加到您要保护的任何方法或类中,如果在没有令牌存在的情况下尝试访问它,则应该收到错误 . 如果要返回401而不是500错误,则需要注册自定义异常处理程序as I have in my example here .看看OpenIddict - 这是一个新项目(在撰写本文时),可以轻松配置在ASP.NET 5中创建JWT令牌和刷新令牌 . 令牌的验证由其他软件处理 .
假设您使用
Identity
和Entity Framework
,最后一行是您添加到ConfigureServices
方法的行:在
Configure
中,您设置OpenIddict来提供JWT令牌:您还可以在
Configure
中配置令牌验证:还有一两个其他小问题,例如您的DbContext需要从OpenIddictContext派生 .
您可以在此博客文章中看到完整的解释:http://capesean.co.za/blog/asp-net-5-jwt-tokens/
功能演示可在以下位置获得:https://github.com/capesean/openiddict-test