2012-03-08 47 views
2

我正在關注Pluralsight video on AuthenticationWCF中的PrincipalPermission身份驗證錯誤

我想簡單PrinciplePermission認證添加到我的web服務:

[PrincipalPermission(SecurityAction.Demand, Role = "Computer\\Group")] 
    public String testDBConnection() 
    { 
     return "success"; 
    } 

在我的WCF客戶端我送:

client.ClientCredentials.UserName.UserName = "Alice"; 
    client.ClientCredentials.UserName.Password = "alice"; 

我已經創建的組,加入愛麗絲它作爲每個視頻,但現在....

我不斷收到錯誤:

「請求主體許可失敗。」

任何想法有什麼不對?

+0

當使用'ClientCredentials'發送用戶名和密碼時,我最近注意到信息在服務器端的'Thread.CurrentPrinciple'中不可用。 'PrinciplePermission'使用'Thread.CurrentPrinciple'來驗證用戶。我不知道你是否可以配置這個。 – Steven 2012-03-08 08:46:20

+0

@Steven謝謝你的回覆,對不起,我不知道Thread.CurrentPriciple是什麼,你能提供更多細節嗎? – iKode 2012-03-08 08:57:23

+0

'Thread.CurrentThread.CurrentPrincipel'返回'IPrincipal'實例,通常是'WindowsPrincipel'。這包含正在運行線程的當前用戶的信息。 – Steven 2012-03-08 10:11:25

回答

1

原理對象是一個只讀對象,它在加載時被設置爲應用程序的安全設置的一部分。我能夠解決這個問題的方式是創建一個繼承IPrincipal的類。您需要在WCF應用程序中執行此操作。

3

當請求到達時,您需要一些代碼在服務器上創建IPrincipal

要做到這一點,最簡單的方法可能是使用ASP.NET RoleProvider,在您需要配置的行爲,例如:如果要配置

<system.web> 
    ... 
    <roleManager enabled="true" defaultProvider="MyRoleProvider"> 
    <providers> 
     <clear/> 
     <add name="MyRoleProvider" 
     ... 

<system.serviceModel> 
    ... 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name=...> 
      ... 
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" 
         roleProviderName="MyRoleProvider" /> 
     </behavior> 
    </serviceBehaviors> 
    ... 

和一個RoleProvider正確以這種方式,然後Thread.CurrentPrincipal將被自動設置,它應該工作。