Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 如何使用Open Id Connect在.net core 2.2 api中使用令牌验证请求_Azure_Asp.net Core 2.0_Openid Connect - Fatal编程技术网

Azure 如何使用Open Id Connect在.net core 2.2 api中使用令牌验证请求

Azure 如何使用Open Id Connect在.net core 2.2 api中使用令牌验证请求,azure,asp.net-core-2.0,openid-connect,Azure,Asp.net Core 2.0,Openid Connect,我有一个.NETCore2.2API设置并部署到Azure。我已经使用OpenId Connect来处理使用azure active directory single tenenat的身份验证,代码如下。还有我控制器上的授权装饰器。一切正常,当我浏览到我的azure部署api(myappname.azurewebsites.net)时,我会得到microsoft登录提示。然后我可以登录并查看我的路线数据 services.AddAuthentication(auth =>

我有一个.NETCore2.2API设置并部署到Azure。我已经使用OpenId Connect来处理使用azure active directory single tenenat的身份验证,代码如下。还有我控制器上的授权装饰器。一切正常,当我浏览到我的azure部署api(myappname.azurewebsites.net)时,我会得到microsoft登录提示。然后我可以登录并查看我的路线数据

        services.AddAuthentication(auth =>
        {
            auth.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            auth.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            auth.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
        .AddCookie()
        .AddOpenIdConnect(opts =>
        {
            Configuration.GetSection("OpenIdConnect").Bind(opts);
            opts.Events = new OpenIdConnectEvents
            {
                OnAuthorizationCodeReceived = ctx =>
                {
                    return Task.CompletedTask;
                }
            };
            opts.Scope.Add("openid");
            opts.Scope.Add("profile");
            opts.Scope.Add("access_as_user");
        });
问题是,当我打开控制器的授权时,我无法从我的angular SPA客户端应用程序调用它。我已成功配置MSAL,我的api调用正在传递令牌。但是,我得到以下错误:

https://login.microsoftonline.com/bit4f574-5968-4a40-049d-1c0dc2ca0513/oauth2/authorize?client_id=caor847f-dd19-4489-bef7-684803728c665&redirect_uri=https%3A%2F%2Fmyapi.azurewebsites.net%2Fsignin oidc&response_type=code%20id_token&scope=openid%20profile%20user_access&response_mode=form_post&nonce=6373737373859487758409.mzhhytaoudeitmlns00nzGXXXWJJJJJJJJJJJJZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZJNI4JDV7E0WV70TVPRGTSEJFG8FYHG3KW14XEXX2ORLKGLS5ALE1UG0C5EHLAPFXBIRBSGFU3UQOWW0U iLeJUbTL8-HPOOIXYNQRWE1WOILNQUYU7LX-usdlglvM4WvLfAyTZ5uQY\U KsOtr08MxWRlQ5HHVk8Moe1k\U 3BCZ8SDKGOWZEKSGIKD\U IWCXGZMGG&x-client-SKU=ID\U NETSTANDARD2\U 0&x-client-ver=5.3.0


我怎样才能解决这个问题?似乎我的api正在将客户端请求重定向到microsoft登录,但我认为这样做的方式应该是,我的api应该验证请求或作用域中的令牌,并在不将请求重定向到登录的情况下授予访问权限。

这里的关键点是将SPA OAuth与api OAuth完全分离,有以下行为:

  • SPA执行重定向处理并从授权服务器获取令牌-此代码基于Javascript,不需要C#“web后端”
  • API通过授权服务器的令牌签名公钥验证令牌-这段代码是基于C#的,这是一种很好的API开发语言
  • 授权服务器是一个开箱即用的组件,比如Azure AD,您自己从来没有编写过JWTs的代码(很高兴看到您已经这么做了)
我看到的许多在线文章混淆了这些关注点,对于刚接触OAuth技术的人来说可能会非常困惑。因此,明确您希望从最终解决方案中得到什么是很重要的

API OAUTH代码

默认情况下,您的C#代码应该只需要几行,首先添加一个包,例如:

<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.8" />
真实世界样本

我的.NETCoreAPI解决方案中有一些可能会引起兴趣的东西。这些示例非常高级,但可以让您运行本地API和SPA,它们可以一起工作


我们的目标是为API和SPA获得最佳的最终结果,因此上述链接可能会帮助您思考您的情况。

因此,我已经处理了API“应用程序”的身份验证过程的代码。我已经删除了它,而是添加了您建议的Jwt身份验证片段。现在,当我点击我的api时,显示了一个未经授权的401。现在我的客户端错误只有:
GEThttps://myapiappname.azurewebsites.net/api/items 401(未经授权)
。这很好,因为它不再重定向到登录。但是,您提供的代码片段如何允许基于令牌的访问?这仍然需要添加吗?我猜我仍然需要添加启动授权代码,类似于API安全配置代码链接中的启动授权代码?我建议首先熟悉令牌声明以及验证过程在OAuth消息方面的工作方式。My有一些关于如何使用工具验证Azure访问令牌的说明。一旦你理解了这一点,你就需要让你的代码做同样的事情。UseJwtBearer是最标准的选择——在你有工作之前,我会忽略观众检查。你可能还需要谷歌/设置一些额外的选项。还有一个问题,仅供我个人启发。一旦将基础api应用程序部署到Azure应用程序服务,Azure中是否可以严格处理所有这些api授权和范围内容?我只是一个好奇的人,如果这个选项作为深入了解azure的一种方式存在的话,我想使用它。不-强制授权是API的角色,所以它必须检查这些东西。Azure只提供OAuth端点并为您发布令牌。
private void ConfigureOAuthTokenValidation(IServiceCollection services)
{
    services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {
                    options.Authority = "https://login.microsoftonline.com/mytenantid";
                    options.Audience = "api://default";
                });