我应该如何处理Identity 2.0、WebAPI 2.1和Owin 2的身份验证



我正在使用

  • 同一域上的仅限浏览器的新客户端
  • 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%信任令牌,它应该经过签名和验证。这取决于你的需要。

对不起,我想这是一个很长的漫谈。。。祝你好运

相关内容

  • 没有找到相关文章

最新更新