我有一个网络应用程序。我的要求是我需要在每次登录时生成oauth2 bearer token。目前我们使用thinktecture来生成令牌,但是这个过程每次都需要大约7秒来生成令牌。有没有办法可以在不使用thinktecture的情况下生成令牌?
答案 0 :(得分:1)
我在下面的文章http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
下载源代码并进行检查。他们在如何创建令牌方面有很好的例子。
答案 1 :(得分:1)
如果您使用ASP.NET Web Application
创建了一个新的Web API
-> Individual User Accounts
。看看App_Start
-> Startup.Auth.cs
。
它应包含以下内容:
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
这意味着您可以发送访问令牌请求,例如请求:
然后您可以验证访问令牌是否有效:
使用此令牌,您现在可以访问用户有权访问的所有受保护资源。
答案 2 :(得分:1)
Asp.net 默认实现将在授权服务器中使用DPAPI ,因此它将使用machine.config文件中存储的machineKey节点中的“ validationKey”值来颁发访问令牌并对其进行保护。将访问令牌发送到资源服务器时,情况相同,它将使用相同的machineKey解密访问令牌并从中提取身份验证票证。
ASP.NET
如果要生成JWT编码的Bearer令牌,则应覆盖ISecureDataFormat<AuthenticationTicket>.Protect()
方法:
CustomJwtFormat.cs
string symmetricKeyAsBase64 = audience.Base64Secret;
var keyByteArray = TextEncodings.Base64Url.Decode(symmetricKeyAsBase64);
var signingKey = new HmacSigningCredentials(keyByteArray);
var issued = data.Properties.IssuedUtc; var expires = data.Properties.ExpiresUtc;
JwtSecurityToken token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime,expires.Value.UtcDateTime, signingKey);
var handler = new JwtSecurityTokenHandler();
//serialize the JSON Web Token to a string
var jwt = handler.WriteToken(token);
return jwt;
将您的自定义JWT格式化程序添加到OAuth选项
OAuthAuthorizationServerOptions OAuthServerOptions = new
OAuthAuthorizationServerOptions()
{
//For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
AccessTokenFormat = new CustomJwtFormat("http://localhost:5001")
};
// Generation and validation
app.UseOAuthBearerTokens(OAuthServerOptions);
app.UseOAuthBearerTokens
帮助程序方法创建令牌服务器和中间件,以验证同一应用程序中的请求令牌。
如果这是一个授权服务器(生成令牌),则应在最后一行使用app.UseOAuthAuthorizationServer(OAuthServerOptions)
ASP.NET Core
遗憾的是,ASP.NET团队只是决定不将OAuthAuthorizationServerMiddleware
移植到asp.net核心:https://github.com/aspnet/Security/issues/83
ASP.NET Core的社区提供的开源身份验证选项:
AspNet.Security.OpenIdConnect.Server :用于ASP.NET Core和OWIN / Katana的低级别,协议优先的OpenID Connect服务器框架。
IdentityServer :用于ASP.NET Core的OpenID Connect和OAuth 2.0框架,已由OpenID Foundation正式认证并在.NET Foundation的管理下。
OpenIddict :用于ASP.NET Core的易于使用的OpenID Connect服务器。