我正在使用IdentityServer4来处理我的ASP.NET核心API中的身份验证和授权 . 我在客户端使用angular4 . 我知道我可以使用tokenype = ResourceOwnerPassword
来使用令牌 endpoints (http://myapidomain/connect/token)来获取 access_token
. 这意味着我在登录UI中提供 username
和 password
进行身份验证 .
我的问题是:我们是否需要实施API Account/Login
?我认为IdentityServer4已经通过cookie身份验证中间件自动处理登录 . 如果我们需要实现API Account/Login
. 实现这一目标的最佳做法是什么 . 我在某处读到的是使用它进行登录
await HttpContext.Authentication.SignInAsync(identityUser.Id, identityUser.UserName);
这用于注销
await HttpContext.Authentication.SignOutAsync
我的第二个问题是:当我从 connect/token
获得 access_token
. 我尝试通过访问http://myapidomain/connect/userinfo获取userinfo . 但我总是得到405错误代码 . 我失踪了什么
在角客户端
authFormHeaders() {
const header = new Headers();
header.append('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
header.append('Accept', 'application/json');
header.append('Authorization', 'Bearer ' + this.oidcSecurityCommon.getAccessToken());
return header;
}
getUserInfo() {
let self = this;
let options = new RequestOptions({
method: RequestMethod.Get,
headers: this.authService.authFormHeaders()
});
return self.http.get(this.authWellKnownEndpoints.userinfoEndpoint, options)
.map((res: Response) => {
return res.json();
})
.catch(self.appService.handleError);
}
在我的API服务器端:
CorsPolicyBuilder corsBuilder = new CorsPolicyBuilder()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.AllowCredentials();
services.AddCors(opts =>
{
opts.AddPolicy("AllowAllOrigins", corsBuilder.Build());
});
var url = optionsAccessor.Value.SystemConfig.Authority;
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = url,
RequireHttpsMetadata = false,
ApiName = "netpower.qms.saas.api"/*,
AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId }*/
});
app.UseCors("AllowAllOrigins");
1 回答
对于角客户端,则应该使用grantype Implicit和不ResourceOwnerPassword .The资源所有者密码凭证授予类型适合在资源所有者具有与客户的信任关系,诸如设备操作系统或高度特权应用程序的情况 . 启用此授权类型时,授权服务器应特别小心,并且只有在其他流不可行时才允许它(来自OAuth Spec)
对于使用Implicit的实现,您可以参考this并使用ResourceOwnerpassword,请参阅this .
资源类型的流程如下
对于具有Angular和Identity Server 4的ResourceOwnerPassword类型,您可以参考this GitHub repo,其中还包含客户端和服务器端的一些示例代码
步骤如下
资源所有者为客户端提供其用户名和密码 .
客户端通过包含从资源所有者收到的凭据,从授权服务器的令牌 endpoints 请求访问令牌 . 发出请求时,客户端使用授权服务器进行身份验证 .
授权服务器对客户端进行身份验证并验证资源所有者凭据,如果有效,则颁发访问令牌 .
do we need to implement API Account/Login anymore?
不,你不必implement.As你怀疑,这是在授权Server.You做会发送到Identity Server的4验证服务器的用户名和密码,将会给您的承载token.And中间件(
app.UseIdentityServerAuthentication
)将验证您的申请的请求 .I try to get userinfo by access http://myapidomain/connect/userinfo. But I always get 405 error code. What are my missing
您可以查看身份服务器日志以找出缺少的内容 . 我捕获了一个示例请求,它看起来像这样