首页 > 解决方案 > 使用 ASP.Net Core 2.0 身份登录应用程序对 ASP.Net MVC Web 应用程序进行身份验证

问题描述

我有一些较旧的 .Net 4.0 Web 应用程序已更新到 4.7.1。他们都使用会员资格连接到 SSO 登录。我使用 .Net Core 2.0 Identity 创建了一个新的登录应用程序,我正在尝试连接到我的旧应用程序并复制他们从会员资格获得的身份验证。

我已遵循https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-2.1&tabs=aspnetcore2x中的指南和示例代码

我添加了 Microsoft.Owin.Security.Interop 并使用 cookie 身份验证设置了我的 Startup.Auth。我从我的 web 配置中删除了 Membership 部分,并添加了:

<remove name="FormsAuthentication" />

我目前处于连接应用程序将重定向到我在 Startup.Auth 类中指定的登录页面的位置。登录后,我可以成功登录,但不会重定向回我的应用程序。我知道我的登录应用程序已成功重定向到 ReturnUrl,从在调试中显式测试它。

看来我正在登录,重定向回我的应用程序,但通过新的 cookie 身份验证被拒绝访问,所以它再次调用我的登录页面。这似乎是我在 1 个或两个应用程序中设置 cookie 身份验证的方式的问题。

登录 Startup.cs

 //setup applicaitoncookie
    services.ConfigureApplicationCookie(options =>
    {
         //Cookie settings
         options.Cookie.HttpOnly = true;
         options.ExpireTimeSpan = TimeSpan.FromMinutes(30);

         //Cookie Name 
         options.Cookie.Name = "COOKIENAME";

          //path for Login is /Account/Login
          options.LoginPath = "/Account/Login";

          //path for Access Denied is /Account/AccessDenied
          options.AccessDeniedPath = "/Account/AccessDenied";

          options.SlidingExpiration = true;   
      });

     services.AddDataProtection().PersistKeysToFileSystem(
           new System.IO.DirectoryInfo(@"\\server\d$\KeyRing"))
           .SetApplicationName("Login");

应用程序启动.Auth

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
      AuthenticationType = "Identity.Application",
      CookieName = "COOKIENAME",
      LoginPath = new PathString("/Home/Index"),
      Provider = new CookieAuthenticationProvider
      {
           OnApplyRedirect = ApplyRedirect,
           OnValidateIdentity = 
           SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, 
           ApplicationUser>(
                validateInterval: TimeSpan.FromMinutes(30),
                regenerateIdentity: (manager, user) => 
                user.GenerateUserIdentityAsync(manager))
       },
       TicketDataFormat = new AspNetTicketDataFormat(
            new DataProtectorShim(
                 DataProtectionProvider.Create(GetKeyRingDirInfo(),
                 (builder) => { 
                     builder.SetApplicationName("Login"); })
                     .CreateProtector(
                "Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
       "Identity.Application",
       "v2"))),
        CookieManager = new ChunkingCookieManager()
    });

private DirectoryInfo GetKeyRingDirInfo()
{
     var projectDirectoryInfo = new 
         DirectoryInfo(@"\\server\d$\KeyRing");

     return projectDirectoryInfo;
 }

 private static void ApplyRedirect(CookieApplyRedirectContext context)
 {
       Uri absoluteUri;

       if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out 
       absoluteUri))
       {
            var path = PathString.FromUriComponent(absoluteUri);
            if (path == context.OwinContext.Request.PathBase + 
                 context.Options.LoginPath)
            {
                 context.RedirectUri = 
                 "http://localhost/VS_2017/Login/Account/Login" +
                        new QueryString(
                            context.Options.ReturnUrlParameter,
                            "?ReturnUrl=/VS_2017/Application");
             }
        }

        context.Response.Redirect(context.RedirectUri);
   }

我已经尝试过使用和不使用 OnApplyRedirect,但我发现在不使用 FormsAuthentication webconfig for Membership 的情况下将用户定向到我的登录应用程序的唯一方法是使用重定向 URL。

我成功地创建了 cookie COOKIENAME 并且它在我的浏览器中被加密了。我想我可能在 Web 应用程序方面遗漏了一些东西,我没有正确调用我的登录应用程序并验证它创建的 cookie。

任何有关我可能出错的地方或下一步看哪里的帮助将不胜感激。谢谢!

标签: c#asp.netasp.net-mvccookiesasp.net-core

解决方案


推荐阅读