在MVC和WCF上对用户进行身份验证和授权

时间:2011-09-22 15:14:35

标签: wcf authentication authorization

对WCF,ASP.Net和身份验证/授权知之甚少,我很难解释困扰我的事情。

我正在使用ASP.Net MVC 3应用程序作为我正在开发的系统的前端。该网站与WCF Web服务进行通信,并从中获取所有信息。

将有预定义的用户,并且每个用户都具有唯一的访问权限(因此操作可以解析特定于该用户的信息)。此外,用户的登录信息将存储在服务端。

现在的问题是,我该如何处理身份验证和/或授权?

我希望用户能够登录网站,所以我猜他会对网络服务进行验证调用,如果经过验证,则设置一个forms.authentication cookie客户端。

然后,如果他提出像ChangePassword这样的新请求(对他来说是独一无二的),我应该以某种方式再次验证他吗?也许已经创建了一个令牌供他发送请求?

我是否也可以只进行所有验证服务,以便服务知道用户是谁并只返回与他相关的数据(无需在方法调用中特别提及他?

这样的服务是否会以某种方式区分客户端网站的授权和用户自己?我的意思是我想确保正在使用的工具是合法的,并且用户尝试执行的操作是正常的。

我很难理解所有这些是如何协同工作的,而是宁愿解释一下这是如何工作的,而不是关于如何做到这一点的教程(就像谷歌搜索一样)。

1 个答案:

答案 0 :(得分:1)

“我很难理解这一切是如何协同工作的”

这是对WCF的一个很好的总结。 :)

WCF将使用成员资格/角色提供程序进行登录。需要在配置文件的serviceModel部分配置它们。

您的服务的用户将使用代理的用户名/密码属性,或者如果不使用生成的代理,则必须自己生成ws-security xml配置。

我删除了除会员/角色之外的所有东西,所以这不是(可能)工作配置部分。

 <system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyCompany.Api.Services.WebService.MyProductServiceBehavior">
      <serviceCredentials>
        <userNameAuthentication
        userNamePasswordValidationMode="MembershipProvider"
        membershipProviderName="MyCompanyMembershipProvider" />
      </serviceCredentials>
      <serviceAuthorization principalPermissionMode='UseAspNetRoles' roleProviderName='MyCompanyRoleProvider' />
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <basicHttpBinding>
    <binding name="MembershipBinding">
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None" />
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="MyCompany.Api.Services.WebService.MyProductServiceBehavior" name="MyCompany.Api.Services.WebService.MyProductService">
    <endpoint address="" binding="basicHttpBinding"  bindingConfiguration="MembershipBinding" contract="MyCompany.Api.Services.WebService.IMyProductService" />
  </service>
</services>

以下是使用生成的代理的示例:

        api = new MyProxyService.MyProxyServiceClient();

        api.ClientCredentials.UserName.UserName = userAcct;
        api.ClientCredentials.UserName.Password = password;

        api.MethodCall();