编辑:进展后,我可以缩小问题的范围:
VS2013 SPA模板(使用ASP.NET标识1.0)中的startup.auth.cs和ApplicationOAuthProvider.cs应进行哪些更改,以便将其迁移到使用ASP。NET身份2.0?
编辑2:我进一步简化了这个问题。如何使用应用程序。将OAuthBearerTokens与ASP。NET Identity 2.0的用于检索DbContext的中间件
app.UseOAuthBearerTokens(new Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerOptions()
{
//What goes here??
});
(在现有的样本中没有这样的例子。)
Asp.net身份框架的V1.0到V2.0alpha之间存在显著差异。有一个示例显示了如何使用V2:
https://aspnet.codeplex.com/SourceControl/latest(请参阅示例->标识->ChangePK)
但该示例不是MVC或SPA。话虽如此,我有一个从VS2013 ASP构建的应用程序。NET SPA应用程序(包含Identity 1.0)。我一直在尝试在MVC应用程序中实现示例中的代码,但我不清楚VS2013 SPA模板中的哪些代码被删除,以支持示例中的编码。
换一种方式问,有人对实现ASP有指导吗。NET身份2.0 alpha。NET MVC应用程序?(理想情况下,从利用身份1.0的VS2013 MVC SPA模板迁移步骤)
如果您正在研究如何为WEBAPI和MVC Cookie身份验证实现Bearer令牌,请查看本文:
ASP。NET Identity 2.0 Cookie&令牌身份验证,包括一个示例项目
简单地说,该解决方案使用OWIN中间件组件UseOAuthBearerAuthentication
和UseCookieAuthentication
(我知道Cookie-auth不是问题的一部分,但与MVC项目非常相关)分别通过Cookie和Token支持基于浏览器的身份验证和WEBAPI请求身份验证。
启动。Auth.cs
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
//This will used the HTTP header: "Authorization" Value: "Bearer 1234123412341234asdfasdfasdfasdf"
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
HostAuthenticationFilter表示通过OWIN中间件进行身份验证的身份验证过滤器:
WebApiConfig.cs
config.SuppressDefaultHostAuthentication();
//This will used the HTTP header: "Authorization" Value: "Bearer 1234123412341234asdfasdfasdfasdf"
config.Filters.Add(new HostAuthenticationFilter("Bearer"));
要生成令牌:
var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, user));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userIdentity.Id));
AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
var currentUtc = new SystemClock().UtcNow;
ticket.Properties.IssuedUtc = currentUtc;
ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
string AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
return AccessToken;
以下只是SPA模板中的代码,其中UserManager的提供程序被2.0 Identity中引入的内容所取代。
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, () => HttpContext.Current.GetOwinContext().Get<ApplicationUserManager>()),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = false
};
这里还有一个通用ApplicationOauthProvider,您可以使用:https://gist.github.com/s093294/9076631(注意,我还没有测试过,只是为你组装好)
示例(如果有):
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
你可以做
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider<ApplicationUserManager,ApplicationUser,Guid>(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = false
};