自从我创建自己的项目以来已经过去了几年,我正试图围绕着更新的做事方式。
现在我想要一个内置于reactjs的网站,将asp.net web api作为后端。
这将允许我将来制作移动应用程序和我想要的任何东西,因为一切都会通过我的网络API。
令我困惑的一件事是身份验证以及实际发生的地方。
我的应用程序的哪个部分正在进行身份验证?它是Web Api还是网站或两者兼而有之?
我的网站只支持ouath(google,facebook,Microsoft等),并且没有传统的登录屏幕。
用户可以通过他们的提供商(比如谷歌)来我的网页注册,然后被允许限制页面并开始做他们想做的任何事情(例如添加课程)。
当他们点击“创建”时,它会向我的api发出请求,在我的数据库中查找用户并查看他们是否有权创建新课程。如果是这样,让他们创建并保存它。如果不拒绝它。
如果他们没有登录并试图用邮递员打网页api,那么他们应该被拒绝。
我知道他们是Web api的OWIN,但我不知道我是否需要它,然后我的反应网站就像OWIN一样。
我也不想使用OWIN内置的数据库表,因为它似乎添加了我想要的更多功能(我只想授权用户)。
你可能会说我有点困惑。希望有人可以帮助我理解这一切。
答案 0 :(得分:1)
这有点复杂,所以我要解释你要做什么。
1)首先使用OAuth提供程序。微软正在改进Identity Server。
身份服务器根据openid为您提供授权和身份验证。
2)身份服务器必须在另一个项目中编译,并在数据库中创建18个表来控制用户和您的客户。
客户端是具有访问权限的应用程序,例如Android应用程序,角度应用程序或资源服务器。根据您的应用程序,您必须选择工作流程。在身份服务器中,您可以选择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("授权"," TypeToken令牌");
最常用的类型标记是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; }
}
此令牌必须由客户端存储,并且每次调用端点时,资源服务器都会对Identity Server进行内部调用,以检查您的令牌是否有效,以及您的令牌是否有效过期与否。
在令牌中,您获得了2种信息范围和声明,这些范围和声明向您说明了对资源的权利&#34;和id,email,name等用户数据信息。这里读取这些属性是自定义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();
}
}
}
真的很复杂,我花了一个月的时间来研究OAuth 2.0协议以及如何运行身份服务器。祝你好运
答案 1 :(得分:0)
以下是您正在尝试执行的操作的完整教程,可帮助您更好地了解Web应用程序如何与.NET中的REST API进行交互
现在您提到要将Google,FB,MSFT等用作身份提供商,因此我建议您查看以下微软刚刚提供的新产品。这使得将多个IDP(身份提供者)集成到您的应用程序中变得非常简单。它还有完整的代码示例,可帮助您入门。
aka.ms/aadb2c
仅供一般学习,我强烈建议您查看此链接,该链接解释有关令牌,OpenID Connect以及访问令牌内部内容的一些理论和基础知识。