Oauth 2.0 如何为单个工具实现OAuth2,而不将其用作我的应用程序';s授权解决方案

Oauth 2.0 如何为单个工具实现OAuth2,而不将其用作我的应用程序';s授权解决方案,oauth-2.0,asp.net-core-mvc,outlook-restapi,Oauth 2.0,Asp.net Core Mvc,Outlook Restapi,我目前有一个MVC站点,在.NETCore中,由一个公共API支持。我的用户必须登录(没有[Anonymous]控制器),并且已使用DotNetCore.authentication提供程序成功完成身份验证。一切都很好 我现在尝试(根据用户请求)实现的功能是让用户在我的站点内的页面上读取和查看他们的Outlook 365日历。表面上看起来不太硬。。。我所要做的就是让他们通过microsoftonline对我注册的应用程序进行身份验证,然后——一旦他们批准——重定向回我的应用程序,查看我现在可以提

我目前有一个MVC站点,在.NETCore中,由一个公共API支持。我的用户必须登录(没有[Anonymous]控制器),并且已使用DotNetCore.authentication提供程序成功完成身份验证。一切都很好

我现在尝试(根据用户请求)实现的功能是让用户在我的站点内的页面上读取和查看他们的Outlook 365日历。表面上看起来不太硬。。。我所要做的就是让他们通过microsoftonline对我注册的应用程序进行身份验证,然后——一旦他们批准——重定向回我的应用程序,查看我现在可以提取的日历事件(可能使用Graph)

原则上,这看起来非常简单和直接。我的困惑来自于不能为单个控制器而不是整个站点实现身份验证。我可以在网上找到的所有OAuth2(或OpenID,或OWIN,或任何你喜欢的)示例——其中有无数个——都希望使用授权来控制整个站点的User.Identity。我不想更改站点范围的身份验证协议;我不想在Startup.cs中添加任何内容;我不希望任何东西超出一个控制器的范围


tldr;有没有一种方法可以直接打电话(或facebook,或谷歌,或其他什么),取回一个代码或令牌,我可以在该站点的该区域为该用户使用,而不让它接管该站点其余部分已经存在的身份验证?

对于其他正在寻找此答案的人,我已经找到了答案(经过多次尝试和错误后)如何在短时间内为单个用户进行身份验证,而不使用对整个应用程序进行身份验证的中间件

    public async Task<IActionResult> OfficeRedirectMethod()
    {
        Uri loginRedirectUri = new Uri(Url.Action(nameof(OfficeAuthorize), "MyApp", null, Request.Scheme));
        var azureADAuthority = @"https://login.microsoftonline.com/common";

        // Generate the parameterized URL for Azure login.
        var authContext = GetProviderContext();
        Uri authUri = await authContext.GetAuthorizationRequestUrlAsync(_scopes, loginRedirectUri.ToString(), null, null, null, azureADAuthority);

        // Redirect the browser to the login page, then come back to the Authorize method below.
        return Redirect(authUri.ToString());
    }

    public async Task<IActionResult> OfficeAuthorize()
    {
        var code = Request.Query["code"].ToString();

        try
        {
            // Trade the code for a token.
            var authContext = GetProviderContext();
            var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(code, _scopes);

            // do whatever with the authResult, here
        }
        catch (Exception ex)
        {
            System.Diagnostics.Trace.WriteLine(ex.ToString());
        }

        return View();
    }

    public ConfidentialClientApplication GetContext()
    {
        var clientId = "OfficeClientId;
        var clientSecret = "OfficeClientSecret";
        var loginRedirectUri = new Uri(@"MyRedirectUri");
        TokenCache tokenCache = new MSALSessionCache().GetMsalCacheInstance();

        return new ConfidentialClientApplication(
            clientId,
            loginRedirectUri.ToString(),
            new ClientCredential(clientSecret),
            tokenCache,
            null);
    }
公共异步任务OfficeDirectMethod() { Uri loginRedirectUri=新Uri(Url.Action(nameof(OfficeAuthorize),“MyApp”,null,Request.Scheme)); var azureadaauthority=@”https://login.microsoftonline.com/common"; //为Azure登录生成参数化URL。 var authContext=GetProviderContext(); Uri authUri=await authContext.GetAuthorizationRequestUrlAsync(_scopes,loginDirectUri.ToString(),null,null,null,azureADAuthority); //将浏览器重定向到登录页面,然后返回下面的授权方法。 返回重定向(authUri.ToString()); } 公共异步任务OfficeAuthorize() { var code=Request.Query[“code”].ToString(); 尝试 { //用代码换取代币。 var authContext=GetProviderContext(); var authResult=await authContext.AcquireTokenByAuthorizationCodeAsync(代码,_作用域); //在这里对authResult执行任何操作 } 捕获(例外情况除外) { System.Diagnostics.Trace.WriteLine(例如ToString()); } 返回视图(); } 公共机密客户端应用程序GetContext() { var clientId=“OfficeClientId; var clientSecret=“OfficeClientSecret”; var loginRedirectUri=新Uri(“MyRedirectUri”); TokenCache TokenCache=新的MSALSessionCache().GetMsalCacheInstance(); 返回新的机密客户端应用程序( clientId, LoginDirectUri.ToString(), 新客户端凭据(clientSecret), 令牌缓存, 无效); } 我不知道除了我之外,这是否对任何人都有帮助;我只知道这是一个似乎不容易通过快速搜索解决的问题