angular - IdentityServer4 + ASP.NET 核心 API + Angular : Login/authentication

标签 angular api asp.net-core identityserver4

我正在使用 IdentityServer4 在我的 ASP.NET 核心 API 中处理身份验证和授权。我在客户端使用 angular4。 我知道我可以使用 token 端点 (http://myapidomain/connect/token) 通过使用 grantype = ResourceOwnerPassword 来获取 access_token。这意味着我在登录 UI 中提供了 usernamepassword 以进行身份​​验证。

我的问题是:我们还需要实现 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 获取用户信息.但我总是得到 405 错误代码。 我缺少什么

在 Angular 客户端

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");

最佳答案

对于 Angular 客户端,您是否应该使用 grantype Implicit而不是 ResourceOwnerPassword .资源所有者密码凭证授予类型适用于资源所有者与客户端有信任关系的情况,例如设备操作系统或高特权应用程序。 授权服务器在启用此授权类型时应特别小心,并且仅在其他流程不可行时才允许它(来自 OAuth Spec )

The resource owner password grant type allows to request tokens on behalf of a user by sending the user’s name and password to the token endpoint. This is so called “non-interactive” authentication and is generally not recommended. There might be reasons for certain legacy or first-party integration scenarios, where this grant type is useful, but the general recommendation is to use an interactive flow like implicit or hybrid for user authentication instead.

使用Implicit实现可以引用this并使用 ResourceOwnerpassword,引用 this .

资源类型的流程如下

+----------+
 | Resource |
 |  Owner   |
 |          |
 +----------+
      v
      |    Resource Owner
     (A) Password Credentials
      |
      v
 +---------+                                  +---------------+
 |         |>--(B)---- Resource Owner ------->|               |
 |         |         Password Credentials     | Authorization |
 | Client  |                                  |     Server    |
 |         |<--(C)---- Access Token ---------<|               |
 |         |    (w/ Optional Refresh Token)   |               |
 +---------+                                  +---------------+

对于Angular和Identity Server 4的ResourceOwnerPassword类型,可以引用this GitHub repo,其中还包含一些客户端和服务器端的示例代码

步骤如下

  1. 资源所有者向客户端提供其用户名和 密码。

  2. 客户端向授权请求访问 token 服务器的 token 端点,包括收到的凭据 来自资源所有者。在发出请求时,客户端 通过授权服务器进行身份验证。

  3. 授权服务器验证客户端并验证 资源所有者凭据,如果有效,则发出访问权限 token 。

我们还需要实现 API 帐户/登录吗?

不,您不必实现。正如您所怀疑的那样,这是在授权服务器中完成的。您将把用户名和密码发送到 Identity Server 4 身份验证服务器,这将为您提供 Bearer token 。还有您的中间件(app.UseIdentityServerAuthentication) 将为您的应用程序验证请求。

我尝试通过访问 http://myapidomain/connect/userinfo 获取用户信息。但我总是得到 405 错误代码。我缺少什么

您可以查看身份服务器日志以找出缺少的内容。我捕获了一个示例请求,它看起来像这样

POST http://myapidomain/connect/token HTTP/1.1
Host: myapidomain
Proxy-Connection: keep-alive
Content-Length: 142
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: http://angularspawebapi.azurewebsites.net
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded


client_id=AngularSPA&grant_type=password&username=admin%40gmail.com&password=Admin01*&scope=WebAPI%20offline_access%20openid%20profile%20roles


GET http://myapidomain/connect/userinfo HTTP/1.1
Host: myapidomain
Proxy-Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjhDRTQ1ODAwQTAwNkExNkZGMzEwOTExMDVCRjNDNTY2MzgzNEUxQkEiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJqT1JZQUtBR29XX3pFSkVRV19QRlpqZzA0Ym8ifQ.eyJuYmYiOjE1MDAwOTk4NjIsImV4cCI6MTUwMDEwMDc2MiwiaXNzIjoiaHR0cDovL2FuZ3VsYXJzcGF3ZWJhcGkuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOlsiaHR0cDovL2FuZ3VsYXJzcGF3ZWJhcGkuYXp1cmV3ZWJzaXRlcy5uZXQvcmVzb3VyY2VzIiwiV2ViQVBJIl0sImNsaWVudF9pZCI6IkFuZ3VsYXJTUEEiLCJzdWIiOiI5Y2I1ZGViNS1iZWRmLTRkMWItOThkNS05ZTFjYTgwNzVhYjAiLCJhdXRoX3RpbWUiOjE1MDAwOTk4NjEsImlkcCI6ImxvY2FsIiwicm9sZSI6ImFkbWluaXN0cmF0b3IiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwicm9sZXMiLCJXZWJBUEkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsicHdkIl19.CZAGtK5hvwgkMvX9NQ-8zTFr8Cv3SRVhM-u1WdqdLwI-qbdknfhhVFFHFpPzEWEJnKhsi3aE_BOb_UtRiDBWNHzlXAGmKSjtd70HOlT3dR9Sj_v09Ld15On3HihgfeDwOzIt10ZYwwjRr1tRCf6Ro41FQ2UrzBYcSFe47md7DSlxPXbjnQAHdu8gHMITFF8Nqx0V9OEw21fofRdBalOpvxf1IBhsJwWLyL4bLFYya8jNispK4MnN_tdaS8kxIMZ8iC_IUlhY4XEj5pkDBA9r8ad_Vn5WavO3Lmr4Tew4uBhlFhbE-Qr6EpErAEBVHVtJYs70XXGJJ7QQLoFNmO5M9w
content-type: text/plain

关于angular - IdentityServer4 + ASP.NET 核心 API + Angular : Login/authentication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45094180/

相关文章:

javascript隐藏 key 等的代码

java - ionic 库中的 future 如何处理?

c# - 如何使用 ASP.NET Core 获取另一个用户的声明

c# - React + ASP.Net-Core CORS 问题

Angular2 单元测试不使用模拟服务

angular - 模板解析错误 : There is no directive with "exportAs" set to "matMenu"

javascript - Ionic 2 的 $on ("$ionicView.beforeEnter") 是什么?

javascript - ngRx 状态更新和 Effects 执行顺序

api - Twitter Api - 速率限制 - 友谊/破坏

asp.net - 如何将包含两个项目的解决方案部署到Azure App Service?