2013-06-13 43 views
2

我正在看幾個使用ACS的例子,他們確實讓我感到很蠢。C#中的Azure ACS設置#

我看着教程在線好像所有我需要的是在配置如下一行:

httpRuntime requestValidationMode="2.0" 

但在這sample project SimpleMVC4一些其他的例子曾在其配置中沒有這樣的行。更糟糕的是,我沒有看到任何引用ACS庫的內容。

另一方面,MVC3示例有一堆亂碼,其中包括一個JavaScript的哈希請求!

public const string HrdPath = "v2/metadata/IdentityProviders.js"; 

    /// <summary> 
    /// Gets the url with its query string representing this request 
    /// </summary> 
    /// <returns></returns> 
    public string GetUrlWithQueryString() 
    { 
     uriBuilder.Path = HrdPath; 
     uriBuilder.Query = parameters.ToQueryString(); 

     return uriBuilder.Uri.AbsoluteUri; 
    } 

,並在Raxor查看

$("#signIn").click(function() { 
     // 
     // Explicit JSONP callback can be used to do client side caching of identity provider data. 
     // 
     $.ajax({ 
      url: "@Html.Raw(Model.GetUrlWithQueryString())", 
      dataType: "jsonp", 

HUH !?

看,我可以只是得到一些簡單的(白癡證明)指針?

  1. 我是一個依賴方
  2. 我有一個MVC 控制器動作,我想告訴用戶這裏是身份提供商(IP),他們可以使用,以及它們各自的網址以及發電將在下面的步驟(3)中驗證的令牌。我如何在C#代碼中獲得這個結果?
  3. 有一次,客戶端,ACS,IP與他們的業務完成,我不在乎那是什麼,就我而言,所有這些都在客戶端,ACS和IP之間。我應該得到用戶的另一個請求。我該如何處理這個請求?我如何驗證用戶是否是猶太教徒?而且他們沒有僞造上述步驟(2)中的令牌。

回答

5

最近我也經歷過類似的痛苦。我是一個完全新手,並且很難理解這一切。我發現Pluralsight Courses from Dominick Baier在理解這些概念方面非常有用。

現在來你的問題。

我有一個MVC控制器動作,我想告訴用戶這裏的 身份提供商(IP),他們可以使用,以及它們各自的URL 以及生成將在步驟驗證令牌(3), 以下。我如何在C#代碼中獲得這個結果?

請看看這個博客帖子爲您的最終創建登錄頁面:https://www.simple-talk.com/cloud/development/creating-a-custom-login-page-for-federated-authentication-with-windows-azure-acs/

一次,客戶端,ACS,IP與他們的業務做,我不在乎 就我而言,所有這些都在客戶端, ACS和IP之間。我應該得到用戶的另一個請求。這個請求我做了什麼 ?我如何驗證用戶是否是猶太教徒?而他們並沒有僞造上述步驟(2)中的令牌。

我不認爲你需要在這裏做任何特別的事情。 ASP。通過將PrincipalIsAuthenticated屬性設置爲true,網絡管道將爲您處理它。這是我的代碼目前的樣子(主要來自上面的博客文章)。對我而言,整個應用程序都受到保護,默認情況下,用戶登錄主頁。我檢查用戶是否被認證。如果他們沒有通過身份驗證,我會向他們展示在ACS中配置的所有身份提供商,並且用戶可以使用其中的任何身份登錄。一旦認證成功,ACS將用戶發回到同一頁面,並且這次用戶被認證。在我的代碼中,如果用戶通過身份驗證,我會爲我的應用程序執行一些索賠轉換。

控制器

public ActionResult Index() 
     { 
      if (!ClaimsPrincipal.Current.Identity.IsAuthenticated) 
      { 
       var idpsUrl = "IdentityProvidersUrl Taken from ACS Login Page"; 
       var webClient = new WebClient() 
       { 
        Encoding = Encoding.UTF8, 
       }; 
       var jsonList = webClient.DownloadString(idpsUrl); 
       var acsResult = JsonConvert.DeserializeObject<List<IdentityProvider>>(jsonList); 
       return View(acsResult); 
      } 
      else 
      { 
       var principal = ClaimsPrincipal.Current; 
       var claims = principal.Claims; 
       //If any claims transformation needs to be done, that can be done here. 
      } 
     } 

查看

@{ 
    ViewBag.Title = "Index"; 
} 


<h2>Index</h2> 

    @foreach (var p in Model) 
    { 
     <p> 
      <a href="@p.LoginUrl">@p.ToString()</a> 
     </p> 
    } 

型號

public class IdentityProvider 
{ 
    public List<string> EmailAddressSuffixes { get; set; } 
    public string ImageUrl { get; set; } 
    public string LoginUrl { get; set; } 
    public string LogoutUrl { get; set; } 
    public string Name { get; set; } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 
+0

謝謝你的回答真棒! +1和一張支票。你已經幫了我很大的忙!如果你不介意,你的回答讓我想到另一個問題:http://stackoverflow.com/questions/17081609/how-is-azure-acs-authentication-secured – Alwyn

+0

我很高興我能夠幫助你出。我也有同樣的問題(但不敢問:))。我已經將這個問題帶給了這個領域專家的一些關注。希望你會從他們那裏得到更好的答案。 –