使用WebForms和WebApi思考IdentityServer v3

时间:2015-02-18 23:03:40

标签: asp.net asp.net-web-api webforms thinktecture-ident-server

我正在尝试用一段时间来弄清楚如何使用Thinktecture IdentityServer v3为传统的webforms应用程序解决SSO(单点登录)。不幸的是我堆积了。

基础设施是这样的:

  • 需要身份验证和授权的WebForm应用程序(可能 cookie或不记名令牌)
  • 一个javascript轻量级应用程序(一旦用户通过身份验证)向WebApi发出请求(位于不同的域上)

我有以下问题希望能帮助我解决问题:

  1. 我无法将旧版webforms应用程序重定向到IdentityServer,即使在Web.Config中设置也是如此。我在Startup.cs中有app.UseCookieAuthentication(....)和app.UseOpenIdConnectAuthentication(....)正确设置(我猜)。对于MVC,[Authorize]属性强制重定向到IdentityServer。如何为webforms做这件事?
  2. 用户登录后是否有办法,将存储在cookie中的令牌作为承载令牌重用于从javascript客户端进行的WebApi调用。我只是想代表当前登录的用户向WebApi请求(再次将webforms应用程序和webapi放在不同的域中)
  3. 非常感谢任何帮助。

    谢谢!

1 个答案:

答案 0 :(得分:4)

我目前正在从事相同类型的项目。这是我到目前为止所发现的。

有4个单独的问题。

  1. Identity Server - 维护用户/客户端/范围的身份验证
  2. WebApi - 使用Identity Server为授权生成的令牌&用户身份信息。
  3. WebForms / JQuery - 我的项目目前处理现有功能的身份验证,重定向到新的WebApi。
  4. 使用Javascript的HTML - 严格使用WebApi for Information。
  5. 以下自定义授权适用于当前通过WebForm登录的用户作为成员资格对象&我不想再次要求用户通过Identity Server重新登录。

    对于直接oAuth身份验证,请在此处查看示例..

    Sample Javascript Client

    配置Javascript一个隐式流可以正常工作。使用api保存令牌连接。

    Identity Server v3

    我必须使用

    进行配置

    Custom Grant w IUserService

    Custom Grants

    这些将显示如何配置自定义授权验证。使用用户服务,您可以让身份服务查询现有用户和定制声明。

    Identity Server有很多配置可以使它成为您自己的配置。这在IdentityServer网站上有很好的记录,我不会介绍如何设置基础知识。

    例如:客户端配置

     return new List<Client>
                {
                    new Client
                    {
                        ClientName = "Custom Grant Client",
                        Enabled = true,
    
                        ClientId = "client",
                        ClientSecrets = new List<ClientSecret>
                        {
                            new ClientSecret("secret".Sha256()),
                        },
    
                        Flow = Flows.Custom,
                        CustomGrantTypeRestrictions = new List<string>
                        {
                            "custom"
                        }
                    }
                };
    

    WebApi - 资源

    实施例 WebApi Client Sample

    需要Nuget包

      

    Thinktecture.IdentityServer.AccessTokenValidation

    Startup.cs

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
                    {
                        //Location of your identity server
                        Authority = "https://localhost:44333/core"
                    });
    

    <强>的WebForms BackEnd WebForms Call

    需要Nuget包

      

    Thinktecture.IdentityModel.Client

        [WebMethod]
        [ScriptMethod(ResponseFormat.Json)]
        public static string AuthorizeClient()
            {
                    var client = new OAuth2Client(
                    //location of identity server, ClientId, ClientSecret
                    new Uri("http://localhost:44333/core/connect/token"),
                    "client",
                    "secret");
               //ClientGrantRestriction, Scope (I have a Client Scope of read), Listing of claims
                var result = client.RequestCustomGrantAsync("custom", "read", new Dictionary<string, string>
                    {
                        { "account_store", "foo" },
                        { "legacy_id", "bob" },
                        { "legacy_secret", "bob" }
                    }).Result;
    
               return result.AccessToken;
            }
    

    这些是此示例的一般声明,但是我可以生成与用户相关的我自己的声明对象,以发送到Identity Server&amp;重新生成WebApi要使用的标识。

    WebForms / JQuery 使用

      

    JQuery.cookie

     $('#btnTokenCreate').click(function (e) {
    
            //Create Token from User Information
            Ajax({
                url: "Default.aspx/AuthorizeClient",
    
                type: "POST"
            },
       null,
       function (data) {
           sendToken = data.d;
    
           //Clear Cookie
           $.removeCookie('UserAccessToken', { path: '/' });
    
           //Make API Wrap Info in Stringify
           $.cookie.json = true;
           //Save Token as Cookie
           $.cookie('UserAccessToken', sendToken, { expires: 7, path: '/' });
    
       });
    

    JQuery WebAPI Ajax 示例Ajax方法 - 注意beforeSend。

    function Ajax(options, apiToken, successCallback) {
        //Perform Ajax Call
        $.ajax({
            url: options.url,
            data: options.params,
            dataType: "json",
            type: options.type,
            async: false,
            contentType: "application/json; charset=utf-8",
            dataFilter: function (data) { return data; },
            //Before Sending Ajax Perform Cursor Switch
            beforeSend: function (xhr) {
                //Adds ApiToken to Ajax Header 
                if (apiToken) {
                    xhr.withCredentials = true;
                    xhr.setRequestHeader("Authorization", " Bearer " + apiToken);
                }
            },
            // Sync Results
            success: function (data, textStatus, jqXHR) {
                successCallback(data, textStatus, jqXHR);
            },
            //Sync Fail Call back
            error: function (jqXHR, textStatus, errorThrown) {
                console.log(errorThrown);
            }
    
        });
    }
    

    AngularJS

    这与使用

    的JQuery有相同的想法
    module.run(function($http) {
    
      //Make API Wrap Info in Stringify
           $.cookie.json = true;
           //Save Token as Cookie
          var token = $.cookie('UserAccessToken');
    $http.defaults.headers.common.Authorization = 'Bearer ' + token });
    

    这假设您使用与WebForm相同的域。否则,我将使用Query字符串重定向到带有令牌的Angular页面。

    对于CORS支持,需要确保WebApi配置了Cors以实现正确的功能。使用

      

    Microsoft.AspNet.WebApi.Cors

    希望这能说明如何处理这个问题