2

我正在查看几个使用 ACS 的示例,它们确实让我觉得自己很愚蠢。

我在网上查看了教程,似乎我所需要的只是配置中的以下行:

  httpRuntime requestValidationMode="2.0"

但是这个 示例项目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 视图中

    $("#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",

咦!?

看我能不能得到一些简单的(白痴证明)指针?

  1. 我是依赖方
  2. 我有一个 MVC控制器动作,我想在这里告诉用户他们可以使用的身份提供程序 (IP),以及他们各自的 URL 以及生成将在下面的步骤 (3) 中验证的令牌。如何在 C# 代码中实现这一点?
  3. 曾经,客户端、ACS、IP 完成了他们的业务,我不在乎那是什么,就我而言,所有这些都在客户端、ACS 和 IP 之间。我应该从用户那里得到另一个请求。我该如何处理这个请求?我如何验证用户是否是 kosher?并且他们没有从上面的步骤(2)中伪造令牌。
4

1 回答 1

5

我最近也经历过类似的痛苦。我是一个完全的新手,很难理解这一切。我发现Dominick Baier 的 Pluralsight Courses对于理解这些概念非常有用。

现在来回答你的问题。

我有一个 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 之间。我应该从用户那里得到另一个请求。我该如何处理这个请求?我如何验证用户是否是 kosher?并且他们没有从上面的步骤(2)中伪造令牌。

我认为你不需要在这里做任何特别的事情。ASP.Net 管道通过将IsAuthenticated属性设置Principal为 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;
    }
}
于 2013-06-13T04:51:34.360 回答