我正在尝试用一段时间来弄清楚如何使用Thinktecture IdentityServer v3为传统的webforms应用程序解决SSO(单点登录)。不幸的是我堆积了。
基础设施是这样的:
我有以下问题希望能帮助我解决问题:
非常感谢任何帮助。
谢谢!
答案 0 :(得分:4)
我目前正在从事相同类型的项目。这是我到目前为止所发现的。
有4个单独的问题。
以下自定义授权适用于当前通过WebForm登录的用户作为成员资格对象&我不想再次要求用户通过Identity Server重新登录。
对于直接oAuth身份验证,请在此处查看示例..
配置Javascript一个隐式流可以正常工作。使用api保存令牌连接。
Identity Server v3
我必须使用
进行配置这些将显示如何配置自定义授权验证。使用用户服务,您可以让身份服务查询现有用户和定制声明。
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 - 资源
需要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
希望这能说明如何处理这个问题