Ubuntu 上的 Asp Net Core - 访问被拒绝

Posted

技术标签:

【中文标题】Ubuntu 上的 Asp Net Core - 访问被拒绝【英文标题】:Asp Net Core on Ubuntu - access is denied 【发布时间】:2017-03-13 01:58:32 【问题描述】:

安装库 MailKit 并调用 new SmtpClient().ConnectAsync(_settings.Server, _settings.Port, _settings.SSL); 后,我收到此错误:

拒绝访问路径“/var/www/.dotnet/corefx/cryptography/crls”。

顺便说一句,我的项目位于 /media/ProjectName。 我尝试执行此操作:sudo chmod -R 755 /var 但出现权限错误。

这里是堆栈跟踪:

在 System.IO.UnixFileSystem.CreateDirectory(String fullPath)↵ 在 System.IO.Directory.CreateDirectory(String path)↵ 在 Internal.Cryptography.Pal.CrlCache.GetCachedCrlPath(X509Certificate2 cert, Boolean mkDir)↵ 在内部。 Cryptography.Pal.CrlCache.DownloadAndAddCrl(X509Certificate2 证书,SafeX509StoreHandle 存储,TimeSpan& 剩余下载时间)↵ 在 Internal.Cryptography.Pal.CrlCache.AddCrlForCertificate(X509Certificate2 证书,SafeX509StoreHandle 存储,X509RevocationMode revocationMode,DateTime 验证时间,时间跨度和剩余下载时间)↵ Pal.OpenSslX509ChainProcessor.BuildChain(X509Certificate2 叶, HashSet1 candidates, HashSet1 已下载, HashSet1 systemTrusted, OidCollection applicationPolicy, OidCollection certificatePolicy, X509RevocationMode revocationMode, X509RevocationFlag revocationFlag, DateTime verificationTime, TimeSpan& remainingDownloadTime)↵ at Internal.Cryptography.Pal.ChainPal.BuildChain(Boolean useMachineContext, ICertificatePal cert, X509Certificate2Collection extraStore, OidCollection applicationPolicy, OidCollection certificatePolicy, X509RevocationMode revocationMode, X509RevocationFlag revocationFlag, DateTime verificationTime, TimeSpan timeout)↵ at System.Security.Cryptography.X509Certificates.X509Chain.Build(X509Certificate2 certificate)↵ at System.Net.Security.CertificateValidation.BuildChainAndVerifyProperties(X509Chain chain, X509Certificate2 remoteCertificate, Boolean checkCertName, String hostName)↵ at System.Net.Security.SecureChannel.VerifyRemoteCertificate(RemoteCertValidationCallback remoteCertValidationCallback)↵ at System.Net.Security.SslState.CompleteHandshake()↵ at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)↵ at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)↵ at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)↵ at System.Net.Security.SslState.ReadFrameCallback(AsyncProtocolRequest asyncRequest)↵--- End of stack trace from previous location where exception was thrown ---↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()↵ at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)↵ at System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult result)↵ at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)↵ at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task`1 promise, Boolean requiresSynchronization)↵--- 堆栈跟踪结束从先前引发异常的位置 ---↵ 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)↵ 在 System.Runtime。 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)↵ 在 MailKit.Net.Smtp.SmtpClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancelToken)↵ 在 MailKit.MailService.c__DisplayClass41_0.b__0()↵ 在 System。 Threading.Tasks.Task.Execute()↵--- 从先前抛出异常的位置结束堆栈跟踪 ---↵ 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)↵ 在 System.Runtime.CompilerServices。 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)↵ 在 MyProject.Services.MessageService.d__4.MoveNext()↵--- 堆栈跟踪从先前抛出异常的位置结束---↵ 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess( Task task)↵ 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)↵ 在 MyProject.Services.MessageService.d__5.MoveNext()

【问题讨论】:

调用堆栈表明代码正在尝试构建和访问证书缓存。您可以手动创建目录并授予必要的权限。不要修改 /var ***目录,因为那太疯狂了。 谢谢你,@LexLi。我应该在写这篇文章之前创建这个目录。它有效! 【参考方案1】:

正如 Lex Li 发布的那样,创建目录 /var/www/.dotnet/corefx/cryptography/crls 并授予 www-data 组的权限(如果这是运行您的服务的组)

sudo chgrp www-data /var/www/.dotnet/corefx/cryptography/crls

【讨论】:

首先需要递归创建目录:mkdir -p /var/www/.dotnet/corefx/cryptography/crls【参考方案2】:

我指的是guide。在 kestrel-hellomvc.service 文件中,将 User=www-data 替换为 User=my-root-username 并且它起作用了。 希望它可以帮助某人。

【讨论】:

这是否意味着 kestrel 匿名 Web 服务器以 root 身份运行?

以上是关于Ubuntu 上的 Asp Net Core - 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core中的Razor很慢

Ubuntu 上对 ASP.NET Core Mvc进行 Docker 部署

ASP.NET Core环境并运行 继续跨平台

Linux系统(ubuntu)部署Asp.Net Core网站

七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

Microsoft 是不是仍支持 .NET Framework 上的 ASP.NET Core?