2016-11-15 66 views
2

我在Web应用程序中使用ASP.Net Identity 2.2,它工作得很好。ASP.Net Identity 2.0无人参与登录

我想要做的是有一个后台服务访问Web应用程序,以生成一些页面的缩略图和/或PDF。此服务最终可能会在w3wp.exe进程中运行,并且会由用户发出的某些Web请求触发,例如,用户改变一些设置并且触发后台服务以重新生成缩略图。

问题是允许后台服务访问页面而不打开其他人可以用来访问页面的后门。目前我的代码可以从Web请求中复制认证Cookie,并使用它们请求页面并生成缩略图,但是我需要能够在没有任何现有连接的情况下复制Cookie。它需要能够获得自己的cookie。

我用来生成PDF /缩略图的库通过向Web服务器发出正常的Web请求并使用无头浏览器来工作。我需要浏览网页服务器,因为页面包含大量的javascript和ajax,因此静态页面很难生成。

理想情况下,它应该使用网络上没有人可以登录的“系统”用户。

我不想以可以快速解码的形式(所有密码都在数据库中散列)存储用户的密码。

有没有人有任何想法如何做到这一点?

我的想法是,如果有一种可靠的方法来识别请求来自缩略图服务,那么服务器可以调用signin()函数而不需要密码,但这本身当然是一个难题因为我们希望防止在服务器上运行Web浏览器的人员绕过安全措施。我不是在想也许是一个共享(一次性使用)的秘密,但不知道这是否可以安全地完成。

+0

您可以为后台服务创建另一个用户并为其设置角色,如BackgroundServiceApp角色。比你写api只有这个角色可以访问,然后你的服务使用这个userAccount登录和访问它自己的应用程序api,它可以获取用户信息。如果您使用的是Azure,则可以查看https://msdn.microsoft.com/en-us/library/azure/dn798668.aspx,也可以使用Azure队列或Amazon Simple Queue。 – Miguel

+0

由于我们试图生成与用户在其屏幕上看到的内容相同的缩略图/ PDF,所以单独的API不是我们想要采用的路线,因此服务访问与用户相同的页面是有意义的,因此减少工作重复,即在流水线的末端增加一个额外的步骤,而不是让两个不同的流水线访问相同的数据。 – Mog0

+0

@ Mog0现在,一种常见的方法是首先构建一个API,然后让您的UI和任何其他自动化服务使用相同的API访问数据。这样你就可以避免你刚才描述的重复问题。如果你已经构建了你的用户界面,显然不会有太大帮助,但只是想我会提到它的未来。 – ADyson

回答

0

你可以让服务运行与您的Web服务的一个特定的用户,然后让用户访问您的网站的特定资源,添加到您的web.config是这样的:

<location path="yourdomain/yourresource"> 
    <system.web> 
    <authorization> 
     <allow users="domainname\user" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</location> 

在这你不必创建一个没有商业价值的假用户,也不需要在你的服务中硬编码或配置用户名和密码。

+0

有趣的想法,但我们的许多客户需要在其IIS设置中禁用Windows集成身份验证,所以我不认为这会在这些情况下工作,即Web应用程序不会知道请求来自的Windows用户。 – Mog0

+0

因此,我认为你应该考虑在你的服务中配置或硬编码用户和密码,因为在某种方式或其他你的服务将不得不对你的web应用程序进行认证 – user449689

+0

@ Mog0另一个想法可能是[这个](http:// serverfault.com/questions/392606/iis-windows-authentication-except-for-local-machine);你可以有一个需要认证的网站,另一个不需要它的网站(有IP限制),只能通过你的服务访问。但我不会那么诚实。 – user449689