这有点复杂,所以我将解释你必须做什么。
1) 首先是使用 OAuth 提供程序。微软正在改进 Identity Server。
身份服务器根据 openid 为您提供授权和身份验证。
2) 身份服务器必须在另一个项目中编译,并将在数据库中创建 18 个表来控制用户和您的客户端。
客户端是具有访问权限的应用,例如 Android 应用、Angular 应用或资源服务器。根据您的应用程序,您必须选择工作流程。在身份服务器中,您可以选择其中的 5 个
https://github.com/IdentityServer
身份服务器 3 用于 asp.net mvc 4.5+,身份服务器 4 用于 ASP.NET Core 1
我猜你的服务器将是一个资源服务器,所以如果你要保存用户帐户,你必须做 2 次注册,在身份服务器中注册,然后在你的资源服务器中。
要配置您的资源服务器并了解两者之间的通信,您必须使用以下内容配置您的 StartUp.cs:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
var clientId = (string)ConfigurationManager.AppSettings["oauth2.clientid"];
var authority = (string)ConfigurationManager.AppSettings["oauth2.authority"];
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = authority,
ValidationMode = ValidationMode.ValidationEndpoint,
RequiredScopes = new[] { clientId },
});
app.UseResourceAuthorization(new AuthorizationManager());
}
private void ConfigureOAuth()
{
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Formatting = Formatting.Indented;
}
}
当您提供令牌并通过 REST 调用服务时,您将在您的 http 标头中发送下一件事:
header.add("Authorization", "TypeToken Token");
使用最多的类型令牌是 Bearer
当您使用 C# 中的 identity.client 类登录时,身份服务器会提供此令牌,为您提供了一个很棒的工具来完成最困难的部分。
配置客户端:
private TokenClient GetTokenClient()
{
var clientId = (string)ConfigurationManager.AppSettings["oauth2.clientid"];
var clientSecret = (string)ConfigurationManager.AppSettings["oauth2.client-secret"];
var tokenEndPoint = (string)ConfigurationManager.AppSettings["openid.endpoints.token"];
var client = new TokenClient(
tokenEndPoint,
clientId,
clientSecret
);
return client;
}
获取令牌:
Route("LoginOAUth")]
[HttpPost]
public async Task<TokenResponse> LoginOAUth(LoginViewModel credentials)
{
var result = await GetTokenClient().RequestResourceOwnerPasswordAsync(credentials.Correo, credentials.Password,
"offline_access AppNameExample-IdentityClient-morgan");
return result;
}
public class LoginModel
{
public string Email { get; set; }
public string Password { get; set; }
}
此令牌必须由客户端存储,并且每次您调用端点时,您的资源服务器都会对身份服务器进行内部调用,以检查您的令牌是否有效,以及您的令牌是否有效过期与否。
在令牌中,您获得 2 种信息范围和声明,这些范围和声明向您说明“资源的权利”和用户数据信息,如 id、电子邮件、姓名等。在这里阅读这些属性是自定义 AuthorizationAttribute 示例:
public class AuthorizationManager : ResourceAuthorizationManager
{
public override Task<bool> CheckAccessAsync(ResourceAuthorizationContext context)
{
switch (context.Resource.First().Value)
{
case "claims":
return AuthorizeValues(context);
default:
return Nok();
}
}
Task<bool> AuthorizeValues(ResourceAuthorizationContext context)
{
switch (context.Action.First().Value)
{
case "read":
return Eval(context.Principal.HasClaim("role", "api-read"));
default:
return Nok();
}
}
}
真的很复杂,我花了 1 个月的时间研究 OAuth 2.0 协议以及身份服务器的工作原理。祝你好运