我正在制作一个与IIS上的wcf服务进行通信的asp.net MVC应用程序。 asp.net MVC应用程序使用正常的登录机制(用户名,密码)。在wcf服务中,我想登录(使用此密码和用户名)以获取用户的windowsidentity。(wcf服务的安全性基于Windows)
问题是我如何以这种方式从asp.net MVC应用程序与服务进行通信并保持asp.net MVC应用程序尽可能无状态(肯定不允许在会话状态中设置密码)
非常感谢有关如何完成这项工作的想法。
这张图可能会让事情变得更清晰:
答案 0 :(得分:1)
这是一篇逐步解释如何在WCF服务中使用用户名/密码进行身份验证的文章:
它在服务端使用自定义UserNamePasswordValidator:
public class CustomValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName == "test" && password == "secret")
{
return;
}
throw new SecurityTokenException("Unknown Username or Password");
}
}
可以配置为服务行为:
<system.serviceModel>
<services>
<service behaviorConfiguration="WcfService.Service1Behavior" name="MySamples.WcfService">
<endpoint address="" binding="wsHttpBinding" contract="MySamples.IWcfService" bindingConfiguration="SafeServiceConf">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfService.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MySamples.CustomValidator, WcfService"
/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="SafeServiceConf" maxReceivedMessageSize="65536">
<readerQuotas maxStringContentLength="65536" maxArrayLength="65536" maxBytesPerRead="65536" />
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
并在客户端:
using (var client = new WcfServiceClient())
{
client.ClientCredentials.UserName.UserName = "test";
client.ClientCredentials.UserName.Password = "secret";
var result = client.SomeMethod();
}
答案 1 :(得分:0)
如果我已正确理解您的问题,您需要一种为WCF服务提供Windows身份验证的方法。以下链接可以提供帮助。
答案 2 :(得分:0)
经过大量的实验,我找到了一种方法。 我将把ASP.NET MVC应用程序称为客户端。
通过loginService,客户端可以传递用户名和密码。在此服务中,此数据用于检查是否存在相应的Windows帐户。如果是这样,则会创建 guid ,并且此guid 以及用户名和密码(均已加密)将存储在数据库中。该服务将guid返回给客户端,将 guid置于会话状态。
当对wcf服务进行另一次调用时,客户端会在名为“id”的 messageheader 中发送此guid。在wcf中,我使用 ServiceAuthorizationManager 来检查传入的消息。如果有一个名为“id”的消息头,则此ID将用于在数据库中获取相应的用户名和密码,使用此用户名和密码获取 windowsidentity ,然后模拟 it。(这一切都在它到达服务本身之前发生)
当用户进入该服务时,他将被模仿他的Windows帐户。