配置代码:
var dataProtection = new Microsoft.AspNet.DataProtection.DataProtectionProvider(new DirectoryInfo(@"\\10.10.10.10\shared-auth-ticket-keys\"));app.UseCookieAuthentication((cookieOptions) =>{cookieOptions.AutomaticAuthenticate = true;cookieOptions.AutomaticChallenge = true;cookieOptions.CookieHttpOnly = true;cookieOptions.ExpireTimeSpan = TimeSpan.FromMinutes(43200);cookieOptions.LoginPath = new PathString("/account/login");cookieOptions.CookieName = ".CNBlogsAdCookie";cookieOptions.CookiePath = "/";cookieOptions.DataProtectionProvider = dataProtection;});
异常信息:
[Error] An unhandled exception was thrown by the application.System.Security.Cryptography.CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. ---> System.IO.DirectoryNotFoundException: Could not find a part of the path '\\10.10.10.10\shared-auth-ticket-keys'.at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)at System.IO.DirectoryInfo.Create()at Microsoft.AspNet.DataProtection.Repositories.FileSystemXmlRepository.<GetAllElementsCore>d__15.MoveNext()at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)at Microsoft.AspNet.DataProtection.Repositories.FileSystemXmlRepository.GetAllElements()at Microsoft.AspNet.DataProtection.KeyManagement.XmlKeyManager.GetAllKeys()at Microsoft.AspNet.DataProtection.KeyManagement.KeyRingProvider.CreateCacheableKeyRingCore(DateTimeOffset now, IKey keyJustAdded)at Microsoft.AspNet.DataProtection.KeyManagement.KeyRingProvider.Microsoft.AspNet.DataProtection.KeyManagement.Internal.ICacheableKeyRingProvider.GetCacheableKeyRing(DateTimeOffset now)at Microsoft.AspNet.DataProtection.KeyManagement.KeyRingProvider.GetCurrentKeyRingCore(DateTime utcNow)at Microsoft.AspNet.DataProtection.KeyManagement.KeyRingProvider.GetCurrentKeyRing()at Microsoft.AspNet.DataProtection.KeyManagement.KeyRingBasedDataProtector.Protect(Byte[] plaintext)--- End of inner exception stack trace ---at Microsoft.AspNet.DataProtection.KeyManagement.KeyRingBasedDataProtector.Protect(Byte[] plaintext)at Microsoft.AspNet.Authentication.SecureDataFormat`1.Protect(TData data, String purpose)at Microsoft.AspNet.Authentication.Cookies.CookieAuthenticationHandler.<HandleSignInAsync>d__13.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Authentication.AuthenticationHandler`1.<SignInAsync>d__61.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Http.Authentication.Internal.DefaultAuthenticationManager.<SignInAsync>d__13.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at CNBlogs.Ad.Web.Controllers.AccountController.<LoginSubmit>d__3.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Mvc.Controllers.ControllerActionExecutor.<CastToObject>d__8`1.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker.<InvokeActionAsync>d__6.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at pilerServices.TaskAwaiter.ValidateEnd(Task task)at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeActionFilterAsync>d__42.MoveNext()--- End of stack trace from previous location where exception was thrown ---at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeAsync>d__33.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler.<InvokeActionAsync>d__8.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()--- End of stack trace from previous location where exception was thrown ---at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.IISPlatformHandler.IISPlatformHandlerMiddleware.<Invoke>d__4.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Hosting.Internal.HostingApplication.<ProcessRequestAsync>d__7.MoveNext()--- End of stack trace from previous location where exception was thrown ---at pilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at pilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNet.Server.Kestrel.Http.Frame`1.<RequestProcessingAsync>d__3.MoveNext()
10.10.10.10 是共享文件服务器,但另一台 Web 服务器访问的时候,会出现上面的错误(文件资源管理可以直接访问)。
解决方案(参考):
On your IIS machine, create a user called IUSER_SHARE (or whatever). Set a password!On your network share machine, create a user called IUSER_SHARE and set the same password.In IIS Manager, select the application pool that your web app is using (create a new one if you are using the default ones). Click on Advanced Settings in the right Actions bar. Under Process Model, change the user to IUSER_SHARE.
补充:第一、二步,在共享文件服务和 Web 服务器,分别创建一个 IUSER_SHARE 账户(密码相同),第三部需要更改 应用程序池的账户(也需要新建相同的账户),示意图: