0

我正在制作一个与 IIS 上的 wcf 服务通信的 asp.net MVC 应用程序。asp.net MVC 应用程序使用正常的登录机制(用户名、密码)。在 wcf 服务中,我想登录(使用此密码和用户名)以获取用户的 windowsidentity。(wcf 服务上的安全性是基于 windows 的)

问题是如何以这种方式从 asp.net MVC 应用程序与服务进行通信,并使 asp.net MVC 应用程序尽可能无状态(绝对不允许在会话状态中输入密码)

非常感谢有关如何完成这项工作的想法。

这张图可能会让事情更清楚: 建筑移动应用网站

4

3 回答 3

1

这是一篇逐步解释如何在 WCF 服务中使用用户名/密码进行身份验证的文章:

http://blog.adnanmasood.com/2010/04/29/step-by-step-guide-for-authenticating-wcf-service-with-username-and-password-over-ssl/

它在服务端使用自定义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();
}
于 2012-08-22T06:19:55.680 回答
0

经过大量的实验,我找到了一种方法来做到这一点。我将 ASP.NET MVC 应用程序称为客户端。

通过 loginService ,客户端可以传递用户名和密码。在此服务中,此数据用于检查是否有相应的 windows 帐户。如果是这样,则会创建一个guid ,并且这个 guid以及用户名和密码(均已加密)将存储在数据库中。该服务将 guid 返回给客户端,客户端将该guid 置于会话状态

当对 wcf 服务进行另一个调用时,客户端会在名为 'id'的消息头中发送此 guid 在 wcf 中,我使用ServiceAuthorizationManager来检查传入的消息。如果有一个名为'id'的messageheader,这个id将用于获取数据库中对应的用户名和密码,并用这个用户名和密码获取windowsidentity然后模拟它。(这一切都发生在它到达服务本身之前)

当用户访问该服务时,他将被模拟为他的 windows 帐户。

于 2012-08-30T11:41:33.147 回答
0

如果我正确理解了您的问题,您需要一种方法来为您的 WCF 服务提供 Windows 身份验证。以下链接可以提供帮助。

关联

于 2012-08-22T06:29:13.073 回答