asp.net MVC应用程序与基于Windows安全性的WCF服务之间的通信

时间:2012-08-22 06:15:50

标签: asp.net-mvc wcf security

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

问题是我如何以这种方式从asp.net MVC应用程序与服务进行通信并保持asp.net MVC应用程序尽可能无状态(肯定不允许在会话状态中设置密码)

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

这张图可能会让事情变得更清晰: Architecture Mobile App Website

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

Link

答案 2 :(得分:0)

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

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

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

当用户进入该服务时,他将被模仿他的Windows帐户。