2013-06-13 41 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

我很高兴我能够帮助你出。我也有同样的问题(但不敢问:))。我已经将这个问题带给了这个领域专家的一些关注。希望你会从他们那里得到更好的答案。 –