2014-02-21 142 views
0

使用.NET Framework 4.5創建SPA應用程序,該應用程序將使用AngularJS。我按照說明實施了System.IdentityModel以指向第三方認證。如何處理註銷和重定向

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> 
    <location path="FederationMetadata"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 

...

<system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <authentication mode="None" /> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime requestValidationType="ourcustomvalidator, ourcustomnamespace" /> 
    <pages controlRenderingCompatibilityVersion="4.0" validateRequest="false" /> 
    </system.web> 

....

<modules runAllManagedModulesForAllRequests="true"> 
     <remove name="FormsAuthentication" /> 
     <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> 

...

所以在最初推出的單頁應用程序,網站重定向到授權網站。從那裏你登錄,授權,你被重定向迴應用程序。

現在我有一個WebAPI Restful部分作爲解決方案的一部分,以及記錄客戶端錯誤以及在應用程序中處理註銷。這導致我幾個問題,我沒有抓住:

1)如果我做一個/ api /註銷呼叫到我的WebApi,我可以調用FederatedAuthentication.SessionAuthenticationModule.SignOut();我在幕後退出。使用角度,我應該如何去重定向用戶?我注意到我發出這個命令後,如果我點擊F5,我的網站就會刷新,但我會自動重新登錄。我寧願回到初始頁面加載時的登錄屏幕。

2)如果我對我的WebApi進行一個/ api /自定義調用,並且我在幕後註銷,我如何捕獲並重定向用戶?現在我沿着線得到一個錯誤信息:

XMLHttpRequest cannot load https://mycustomloginurl.com/?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a561…%3dpassive%26ru%3d%252fwebapi%252fims%252ftesting&wct=2014-02-21T21%3a47%3a09Z. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:56181' is therefore not allowed access. 

抱歉,如果這混亂的,我試圖環繞這一切我的頭。

+0

好吧,我其實是想出了第一個。我需要得到signOutURI,然後用返回值做一個$ window.location.href。我仍然困惑如何處理第二個問題。 – hammer

回答

0

感謝一些更多的研究,這篇文章:Prevent XmlHttpRequest redirect response in .Net MVC WS-Federation Site幫助我得到正確的答案。

基本上我遵循相同的代碼,但增加了以下內容:

resp.Clear(); // cleared the response 
var fa = FederatedAuthentication.WSFederationAuthenticationModule; 
var signInRequestMessage = new SignInRequestMessage(new Uri(fa.Issuer), fa.Realm); 
var signInURI = signInRequestMessage.WriteQueryString(); 
resp.Write(signInURI); 

所以我清除響應並作出響應的主體包含用於驗證在登錄URL。在角度,我有一個HTTP攔截器,檢查狀態代碼401,然後使用上述數據重定向到登錄。

app.config([ 
    '$httpProvider', function($httpProvider) { 

    var interceptor = ['$rootScope', '$q','$window', function (scope, $q, $window) { 
     function success(response) { 
      return response; 
     } 
     function error(response) { 
      var status = response.status; 
      if (status == 401) { 
       $window.location.href = response.data.replace(/"/g, ""); 
      } 
      // otherwise 
      return $q.reject(response); 
     } 
     return function (promise) { 
      return promise.then(success, error); 
     } 
    }]; 
    $httpProvider.responseInterceptors.push(interceptor); 
    } 
]);