我'm working with ASP.NET Core application. I' m试图实现基于令牌的身份验证,但无法弄清楚如何使用新的Security System .
My scenario: 客户端请求令牌 . 我的服务器应该授权用户并返回access_token,客户端将在以下请求中使用该access_token .
这里有两篇关于正确实现我需要的文章:
问题是 - 对我来说,如何在ASP.NET Core中做同样的事情并不明显 .
My question is: 如何配置ASP.NET Core Web Api应用程序以使用基于令牌的身份验证?我应该追求什么方向?你有没有写过关于最新版本的文章,或者知道我在哪里可以找到它?
谢谢!
5 回答
要实现您描述的内容,您需要OAuth2 / OpenID Connect授权服务器和验证API访问令牌的中间件 . Katana曾经提供
OAuthAuthorizationServerMiddleware
,但它在ASP.NET Core中不再存在 .我建议看看 AspNet.Security.OpenIdConnect.Server ,OAuth2授权服务器中间件的实验分支,你提到的教程使用它:有一个OWIN / Katana 3版本,以及一个支持两者的ASP.NET核心版本
net451
(.NET桌面)和netstandard1.4
(与.NET Core兼容) .https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server
不要错过MVC Core示例,该示例演示了如何使用 AspNet.Security.OpenIdConnect.Server 配置OpenID Connect授权服务器以及如何验证服务器中间件发出的加密访问令牌:https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/dev/samples/Mvc/Mvc.Server/Startup.cs
您还可以阅读此博客文章,其中解释了如何实现资源所有者密码授权,这是与基本身份验证等效的OAuth2:http://kevinchalet.com/2016/07/13/creating-your-own-openid-connect-server-with-asos-implementing-the-resource-owner-password-credentials-grant/
Startup.cs
project.json
祝好运!
您可以查看OpenId连接示例,它们说明了如何处理不同的身份验证机制,包括JWT令牌:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
如果您查看Cordova后端项目,API的配置如下:
/Providers/AuthorizationProvider.cs中的逻辑和该项目的RessourceController也值得一看;) .
此外,我使用Aurelia前端框架和ASP.NET核心实现了一个基于令牌的身份验证实现的单页面应用程序 . 还有一个信号R持久连接 . 但是我没有做过任何数据库实现 . 代码可以在这里看到:https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
希望这可以帮助,
最好,
亚历克斯
您可以使用OpenIddict来提供令牌(登录),然后在访问API / Controller时使用
UseJwtBearerAuthentication
来验证它们 .这基本上是
Startup.cs
中您需要的所有配置:ConfigureServices:
Configure
还有一两个其他小的东西,例如你的DbContext需要派生自
OpenIddictContext<ApplicationUser, Application, ApplicationRole, string>
.我可以在这篇博文中看到一个完整的解释(包括正在运行的github repo):http://capesean.co.za/blog/asp-net-5-jwt-tokens/
将其保存为.xml文件并将其包含在您的应用程序中;我将它嵌入到我的DLL中,因为它是一个小型的个人项目,我认为无论如何都没有人可以访问我的程序集,但是有很多理由说明为什么这不是一个好主意,所以我不在这里提供这个例子 . 最终,您必须决定什么是最适合您的项目 .
注意:有人指出
ToXmlString
和FromXmlString
在.NET Core中不可用 . 相反,您可以使用RSAParameters ExportParameters(bool includePrivateParameters)
和void ImportParameters(RSAParameters parameters)
以符合Core的方式自行保存/加载值,例如使用JSON .ConfigureServices
. 我们'll use dependency injection later to access these settings. I'米离开了访问RSA xml流;但我假设您可以在stream
变量中访问它 .UseIdentity
行之前执行此操作 . 请注意,任何第三方身份验证行(例如UseGoogleAuthentication
)都必须UseIdentity
行UseIdentity
行 . 如果您使用Identity,则不需要任何UseCookieAuthentication
.AuthorizationPolicy
. 这将允许您指定仅允许使用[Authorize("Bearer")]
进行身份验证的承载令牌的控制器和操作 .这个位是从构造函数注入的;这就是为什么我们配置上面的选项而不是简单地将它们传递给UseOAuthBearerAuthentication()
然后,在你的
/Token
行动......var token
是您的持票人令牌 - 您可以将此字符串作为字符串返回给用户,以便按照您对Bearer的期望传递认证 .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"的理想候选者,但我还是可能的've not worked out if that' . 如果您解决了,请提交拉取请求!
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 .