Windows身份验证的SharePoint自定义页面发布表单

时间:2018-08-25 15:33:27

标签: sharepoint sharepoint-2013 windows-authentication

我是SharePoint的新手,当我向自托管的WCF端点提交自定义表单时,想了解如何获取登录的(Windows身份验证)用户详细信息?

**HTML**    
<form action="/TestWCF/Submit" method="post">
      First name: <input type="text" name="fname"><br>
      Last name: <input type="text" name="lname"><br>
      <input type="submit" value="Submit">
    </form>

**WCF**
    public void Submit(User user)
    {

    }

呈现的SharePoint页面是否存储一个cookie,我应该将它与自定义post方法一起传递?因为如果它是一个asp.net网络应用程序,我可以获取存储在客户端中的令牌并将其发送到服务器并对其进行验证。但是SharePoint我没有太多控制权。

1 个答案:

答案 0 :(得分:0)

用户名经过定制验证。这是由FarmService程序集中的FarmService.Authentication.DistributorValidator类完成的。此类从WCF类UserNamePasswordValidator继承,并且重写Validate方法。

public class DistributorValidator : UserNamePasswordValidator

{

public override void Validate(string userName, string password)

{

    if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))

        throw new SecurityTokenException("Username and password required");

    var repository = new DistributorRepository();

    if (! repository.IsKnownDistributor(userName, password))

        throw new FaultException(string.Format("Wrong username ({0}) or password ", userName));

}

}

除了一个绝对必要的细节。为了使用户名密码身份验证正常工作,托管服务的服务器需要X509证书。否则,所有服务调用都会失败。该证书是在服务行为中指定的。

<serviceCertificate findValue="Farm" storeLocation="LocalMachine" storeName="TrustedPeople"  x509FindType="FindBySubjectName"/>

首先,您需要一个证书。您可以创建自己的服务器,而不用购买一个服务器(该地址绑定到特定的服务器地址,因此对于测试目的毫无用处)。 .net框架附带了生成这些工具的工具,并且有一些教程介绍如何使用这些工具。自我验证的多元视野工具要轻松得多,只需单击几下即可完成整个过程。

他们在这里没有告诉您,您必须以管理员身份运行该工具,否则它将最不正常地崩溃。该工具还不清楚的是在何处存储生成的证书。默认情况下,它存储在MyStore中。验证证书时,其可信度取决于其存储位置。当商店不受信任时,将启动验证链。除了设置证书链之外,您还可以将证书直接存储在受信任的存储区中。

要使用此服务,请在客户端中添加服务引用。服务配置中的mexHttpBinding使无需任何凭据即可读取服务中的所有元数据。

建立与客户端的连接需要一些摆弄。同样,默认情况下并非所有这些设置都是清除的。

var endPoint = new EndpointAddress(new Uri(Farm.FarmUrl), EndpointIdentity.CreateDnsIdentity("Farm"));

var binding = new WSHttpBinding();

binding.Security.Mode = SecurityMode.Message;

binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
var result = new CustomerDeskOperationsClient(binding, endPoint);

result.ClientCredentials.UserName.UserName = Farm.FarmUserName;

result.ClientCredentials.UserName.Password = Farm.FarmPassword;

详细信息可以参考A simple WCF service with username password authentication

希望有帮助!