我正在使用
- 同一域上的仅限浏览器的新客户端
- Identity 2.0
- WebAPI 2.1
- Owin 2.1
- AngularJS前端,用于注册、登录和数据显示
在具有AngularJS前端的WebAPI应用程序中。
我正在阅读关于令牌身份验证的文章,但我现在非常困惑,我找不到任何使用我的组合的好例子。我想知道的是,我应该使用cookie还是令牌进行身份验证。我应该使用Userfactory还是CreatePerOwinContext?
以下是我在创业中的经验。Auth.cs
public partial class Startup {
public void ConfigureAuth(IAppBuilder app) {
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/"),
Provider = new CookieAuthenticationProvider {
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
// Enables the application to remember the second login verification factor such as phone or email.
// Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
// This is similar to the RememberMe option when you log in.
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
}
}
这是我的WebAPI配置:
public static class WebApiConfig
{
public static void CustomizeConfig(HttpConfiguration config)
{
config.Formatters.Remove(config.Formatters.XmlFormatter);
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
json.SerializerSettings.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-ddTHH:mmZ" });
}
我看到了一些使用此代码的示例,但我不确定如何调用它:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
我可以用这个代替cookie身份验证吗?
不是专家,但在我的涉猎中,我发现代币对api以及从javascript到api都很有效,而传统的cookie主要倾向于ui。两者中的任何一个都可以,这取决于你尝试做什么。
你可以关注这样的链接,它为ui做cookie,为api做tokenhttp://blog.iteedee.com/2014/03/asp-net-identity-2-0-cookie-token-authentication/
app.CreatePerOwinContext(ApplicationSession.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
// Token Authentication
app.UseOAuthBearerAuthentication(new OAuthBearerOptions());
我认为,如果你想同时使用bearer,你可以将cookie身份验证选项的身份验证类型设置为bearer。但你必须使用它。令牌将在".AspNet.ExternalBearer"下的owincontext中。
我还认为,如果您注册Identity 2.0中间件,我认为它也会注册oauth中间件,因此您不需要自己注册oauthserver中间件。这是您发布的OAuthAuthorizationServerOptions代码。你不需要它。
如果ui和api是分开的,那么如果你想从ui传递到api进行某种单点登录,那就有点困难了。我建议查看thinktructure的开源身份服务器或授权服务器。
如果您在owin中间件和Identity 2.0上进行设置,则需要确保应用程序和api都可以读取令牌,并且可能需要实现ISecureDataFormat。但请记住,解密并不意味着你可以100%信任令牌,它应该经过签名和验证。这取决于你的需要。
对不起,我想这是一个很长的漫谈。。。祝你好运