Azure ACS在C#中设置

时间:2013-06-13 03:53:30

标签: asp.net asp.net-mvc asp.net-mvc-3 azure acs

我正在研究使用ACS的几个例子,并且他们确实让我感到愚蠢。

我在线查看了教程,看起来我需要的只是配置中的以下行:

  httpRuntime requestValidationMode="2.0"

但是这个sample project SimpleMVC4中的其他一些例子在其配置中没有这样的行。更糟糕的是,我没有看到任何可能引用ACS库的内容。

另一方面,MVC3样本有一堆乱码,包括对javascript的ajax请求!?

    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 View中

    $("#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),他们各自的URL以及生成将被验证的令牌在下面的步骤(3)中。我如何用C#代码实现这个目标?
  3. 有一次,客户端,ACS,IP都是用他们的业务完成的,我不在乎那是什么,只要我关心客户端,ACS和IP之间的所有这些。我应该收到用户的另一个请求。我该怎么办这个请求?如何验证用户是否是犹太洁食?并且他们没有伪造上述步骤(2)中的令牌。

1 个答案:

答案 0 :(得分: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.Net管道通过将IsAuthenticated的{​​{1}}属性设置为true来为您处理。这是我的代码目前的样子(主要来自上面的博客文章)。对我来说,整个应用程序都受到保护,默认情况下用户登陆主页。我检查用户是否经过身份验证。如果他们未经过身份验证,我会向他们展示ACS中配置的所有身份提供商,用户可以使用其中任何一个进行登录。身份验证成功后,ACS会将用户重新发送回同一页面,这次用户将通过身份验证。在我的代码中,如果用户通过身份验证,我会对我的应用程序进行一系列声明转换。

<强>控制器

Principal

查看

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>
    }