加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 带有WebForms和WebApi的Thinktecture IdentityServer

发布时间:2020-12-16 03:29:56 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试用一段时间来弄清楚如何使用Thinktecture IdentityServer v3为传统的webforms应用程序解决SSO(单点登录).不幸的是我堆积了. 基础设施是这样的: 需要身份验证和授权的WebForm应用程序(可能 cookie或bearer token) 一个javascript轻量级应用程序(一
我正在尝试用一段时间来弄清楚如何使用Thinktecture IdentityServer v3为传统的webforms应用程序解决SSO(单点登录).不幸的是我堆积了.

基础设施是这样的:

>需要身份验证和授权的WebForm应用程序(可能
cookie或bearer token)
>一个javascript轻量级应用程序(一旦用户通过身份验证)向WebApi发出请求(在单独的域上)

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

>即使使用Web.Config中的set,我也无法使旧的webforms应用程序重定向到IdentityServer.我在Startup.cs中有app.UseCookieAuthentication(….)和app.USEOpenIdConnectAuthentication(….)正确设置(我猜).对于MVC,[Authorize]属性强制重定向到IdentityServer.如何为webforms做到这一点?
>一旦用户登录,是否存在一种方法,将存储在cookie中的令牌作为承载令牌重用于从javascript客户端进行的WebApi调用.我只是想代表当前登录的用户对WebApi做请求(webforms应用程序和webapi再次位于不同的域上)

任何帮助都感激不尽.

谢谢!

解决方法

我目前正在开发相同类型的项目.这是我到目前为止所发现的.

有4个单独的问题.

> Identity Server – 维护用户/客户端/范围的身份验证
> WebApi – 消耗由Identity Server生成的用于授权的令牌&用户身份信息.
> WebForms / JQuery – 我的项目目前处理现有功能的身份验证重定向到新的WebApi.
>使用Javascript的HTML – 严格使用WebApi信息.

下面的自定义授权适用于当前通过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&重新生成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,jqXHR);
        },//Sync Fail Call back
        error: function (jqXHR,errorThrown) {
            console.log(errorThrown);
        }

    });
}

AngularJS

这与使用JQuery的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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读