2012-06-30 45 views
3

我有VS2012RC的WIF工具,我試圖讓我的ASP.NET MVC 4項目使用它們。我已經爲Microsoft.IdentityModel.dll安裝了NuGet package身份不是使用WIF的IClaimsIdentity(在ASP.NET MVC 4/Azure上)

MVC項目是Azure項目的一部分,但我現在選擇了啓動MVC項目。

目前,我選擇了「本地開發測試STS」(使用默認設置)。當我執行下面的代碼(在我的HomeController索引視圖):

<p>Authenticated: @User.Identity.IsAuthenticated</p> 
<p>Name: @User.Identity.Name</p> 
@{ 
    var identity = User.Identity as Microsoft.IdentityModel.Claims.IClaimsIdentity; 
    if (identity == null) 
    { 
     <p>Error: no identity claims to process!</p> 
    } 
    else 
    { 
     <table> 
      <tr> 
       <th>Type</th><th>Value</th><th>Issuer</th><th>Original Issuer</th> 
      </tr> 
      @foreach (var claim in identity.Claims) 
      { 
       <tr> 
        <td>@claim.ClaimType</td><td>@claim.Value</td><td>@claim.Issuer</td><td>@claim.OriginalIssuer</td> 
       </tr> 
      } 
     </table> 
    } 
} 

然後我得到的輸出是這樣的:

<p>Authenticated: True</p> 
<p>Name: Terry</p> 
<p>Error: no identity claims to process!</p> 

爲什麼不索賠被拾起?

這裏的web.config文件的相關部分:

<configSections> 
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
</configSections> 
<appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    <add key="webpages:Version" value="2.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="PreserveLoginUrl" value="true" /> 
    <add key="ida:FederationMetadataLocation" value="http://localhost:13340/wsFederationSTS/FederationMetadata/2007-06/FederationMetadata.xml" /> 
    <add key="ida:ProviderSelection" value="localSTS" /> 
</appSettings> 
<location path="FederationMetadata"> 
    <system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
<system.web> 
    <authorization> 
    <deny users="?" /> 
    </authorization> 
    <authentication mode="None" /> 
    <profile defaultProvider="DefaultProfileProvider"> 
    <providers> 
     <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> 
    </providers> 
    </profile> 
    <membership defaultProvider="DefaultMembershipProvider"> 
    <providers> 
     <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
    </providers> 
    </membership> 
    <roleManager defaultProvider="DefaultRoleProvider"> 
    <providers> 
     <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> 
    </providers> 
    </roleManager> 
    <sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
    <providers> 
     <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 
    </providers> 
    </sessionState> 
</system.web> 
<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    </modules> 
</system.webServer> 
<system.identityModel> 
    <identityConfiguration> 
    <audienceUris> 
     <add value="http://localhost:50332/" /> 
    </audienceUris> 
    <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <trustedIssuers> 
     <add thumbprint="9B74CB2F320F7AAFC156E1252270B1DC01EF40D0" name="LocalSTS" /> 
     <add thumbprint="C00C014CA49559426B6D70162C2D89689E9397FF" name="https://nitoprograms-0.accesscontrol.windows.net/" /> 
     </trustedIssuers> 
    </issuerNameRegistry> 
    <certificateValidation certificateValidationMode="None" /> 
    </identityConfiguration> 
</system.identityModel> 
<system.identityModel.services> 
    <federationConfiguration> 
    <cookieHandler requireSsl="false" /> 
    <wsFederation passiveRedirectEnabled="true" issuer="http://localhost:13340/wsFederationSTS/Issue" realm="http://localhost:50332/" reply="http://localhost:50332/" requireHttps="false" /> 
    </federationConfiguration> 
</system.identityModel.services> 

回答

2

在本地運行(在Windows 8 Release Preview的計算機上),下面的代碼確實工作:

<p>Authenticated: @User.Identity.IsAuthenticated</p> 
<p>Name: @User.Identity.Name</p> 
@{ 
    dynamic identity = User.Identity; 
    <table> 
     <tr> 
      <th>Type</th><th>Value</th><th>Issuer</th><th>Original Issuer</th> 
     </tr> 
     @foreach (var claim in identity.Claims) 
     { 
      <tr> 
       <td>@claim.Type</td><td>@claim.Value</td><td>@claim.Issuer</td><td>@claim.OriginalIssuer</td> 
      </tr> 
     } 
    </table> 
} 

這導致我相信VS2012RC的WIF工具只支持.NET 4.5作爲目標。

在本地運行時,實際運行時爲.NET 4.5,它具有與WIF相關的核心身份更改(將this diagram for .NET 4.0this diagram for .NET 4.5進行比較)。因此,通過使用dynamic(並將ClaimType更改爲Type),我可以在本地訪問.NET 4.5 WIF運行庫(即使項目的目標是.NET 4.0)。

我試着部署到雲中,但該應用程序抱怨沒有找到System.IdentityModel.Services.dll(因爲Azure目前只使用.NET 4.0)。對於我來說不算太大的交易,因爲我不打算在.NET 4.5發佈之前進行部署。

0

我想你錯過了「經典」模式(不知道你是如何運行應用程序)ASP.NET配置中的WIF模塊。嘗試添加這些:

<system.web> 
    <httpModules> 
      <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
      <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </httpModules>... 
</system.web> 

看到這裏的經典和集成模式的HTTP模塊的詳細信息:http://msdn.microsoft.com/en-us/library/ms227673.aspx