ASP.NET Identity OWIN 中间件 Google OAuth2 AuthenticationManager 登录不起作用

2023-12-14

我创建了一个简单的 ASP.NET MVC4 网站来测试新的 OWIN 身份验证中间件,我决定从 Google OAuth2 开始,我在配置方面遇到了很大的困难,但我设法让 Google 授权用户,我现在遇到的问题是 OWIN 未对用户进行身份验证。

我认为我在网络配置中有正确的设置

<system.web>
     <authentication mode="None" />
</system.web>
<system.webServer>
     <modules>
        <remove name="FormsAuthenticationModule" />
     </modules>
</system.webServer>

然后我在 Startup 类中有一个非常简单的配置

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        // Enable the External Sign In Cookie.
        app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ExternalCookie);
        // Enable Google authentication.
        app.UseGoogleAuthentication(GetGoogleOptions());
    }

    private static GoogleOAuth2AuthenticationOptions GetGoogleOptions()
    {
        var reader = new KeyReader();
        var keys = reader.GetKey("google");
        var options = new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = keys.Public,
            ClientSecret = keys.Private
        };
        return options;
    }
}

In the AccountController我已经按照以下方式对操作进行了编码,这又非常简单,但它应该可以工作。

[AllowAnonymous, HttpPost, ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }

    [AllowAnonymous, HttpGet]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null || !loginInfo.ExternalIdentity.IsAuthenticated)
        {
            return RedirectToAction("Login");
        }

        var identity = new ClaimsIdentity(new[] {
            new Claim(ClaimTypes.Name, loginInfo.DefaultUserName),
            new Claim(ClaimTypes.Email, loginInfo.Email)
        }, DefaultAuthenticationTypes.ExternalCookie);

        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);

        AuthenticationManager.SignIn(new AuthenticationProperties
                {
                    IsPersistent = false
                }, identity);

        return RedirectToLocal(returnUrl);
    }

我遇到的主要问题是对该方法的调用AuthenticationManager.SignIn当用户被重定向到我有以下代码的主页时,即使 Google 授予对请求的访问权限,似乎也没有执行任何操作

@using Microsoft.AspNet.Identity
@{
    Layout = "~/Views/Shared/_Main.cshtml";
}
<h2>Welcome</h2>
@{
    if (Request.IsAuthenticated)
    {
        <p>Welcome @User.Identity.GetUserName()</p>
    }
    else
    {
        @Html.ActionLink("Login", "Login", "Account") 
    }
}

的价值Request.IsAuthenticated总是错误的,有人知道我在这里错过了什么吗?从我在网上读到的内容来看,这应该有效。

我在我的浏览器和其他 Google OAuth 示例中启用了 cookie,这些示例依赖于UserManager课堂工作,但我的这个简单实现不起作用


经过无数个小时在网上阅读答案后,我决定调试 OWIN 源代码以找到该问题的解决方案,而在调试会话中我遇到了这个 gemAuthenticationHandler class

if (BaseOptions.AuthenticationMode == AuthenticationMode.Active)
        {
            AuthenticationTicket ticket = await AuthenticateAsync();
            if (ticket != null && ticket.Identity != null)
            {
                Helper.AddUserIdentity(ticket.Identity);
            }
        }

在我原来的StartupI 类正在使用此方法启用外部登录 cookie

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

此方法使用默认值CookieAuthenticationOptions实例有AuthenticationMode = AuthenticationMode.Passive这会阻止类读取 cookie 中存储的信息,这样在每个新请求中,OwinContext 都不会加载经过身份验证的身份,并导致Request.IsAuthenticated

当我意识到这一点之后我所做的就是改变app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);有了这个

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                AuthenticationMode = AuthenticationMode.Passive,
                AuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
                ExpireTimeSpan = TimeSpan.FromMinutes(30)
            });

一切都很顺利

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Identity OWIN 中间件 Google OAuth2 AuthenticationManager 登录不起作用 的相关文章

  • 友好的 URL 和查询字符串

    在我的项目 ASP NET Web Forms 中我想使用友好的网址 http www nuget org packages Microsoft AspNet FriendlyUrls 从 NuGet 安装 我注册了route in 全局
  • ~ C 中的运算符

    该程序的输出是 13 我从来没有完全理解 C 中的 运算符 为什么它给出 13 作为输出 如何将 运算符限制为数字的 4 位 include
  • WTL 子窗口事件处理

    我正在开发窗口应用程序 因为我在左侧和右侧有 2 个子窗口 我想分别处理两个窗口的输入事件 如何实现 My code class EditorWindow public DxWindow public CSplitterWindow m v
  • 异步方法调用和模拟

    为什么模拟用户上下文仅在异步方法调用之前可用 我编写了一些代码 实际上基于 Web API 来检查模拟用户上下文的行为 async Task
  • x64 DLL 导出函数名称

    我正在尝试将 32 位 dll 和应用程序 移植到 64 位 并且我成功地构建了它而没有错误 当尝试使用我的 64 位应用程序加载它时 我注意到导出的函数名称不同 这就是我导出函数的方式 ifdef cplusplus extern C e
  • 如何更改 gdb 中的值

    所以我有这个家庭作业代码 我必须使用 gdb 进行调试 我发现了问题 但不知道如何使用gdb来改变它 define ARRAYSIZE 12 for i ARRAYSIZE 2 i gt 0 i for j i j lt ARRAYSIZE
  • 创建新文件夹的“Shell 命名空间”方式是什么?

    显然 这对于 win32 api CreateDirectory 来说是微不足道的 但我正在尝试托管一个 IShellView 并且希望以最面向 shell 的方式来做到这一点 我本以为 IShellFolder 中会有一个 createo
  • 如何在Linux上正确设置串行通信

    我正在尝试从 FPGA 板读取数据以及向 FPGA 板写入数据 该板本身附带一个驱动程序 每当板插入时 该驱动程序都会创建一个名为 ttyUSB0 的终端设备 在 FPGA 上 实现了异步接收器和发送器 并且它们似乎可以工作 然而 C 方面
  • 如果 EF 5 如何定义自定义命名约定

    假设我有一个数据库 其中有 1 个名为Products 因此 我采用了 Db First 方法 并在 VS 2012 中创建了一个 EF 模型 pluralize and singularize option 因此 该模型创建了一个Prod
  • .NET 垃圾收集行为(使用 DataTable 对象)

    我想知道为什么在创建一个非常简单的 DataTable 并将其设置为 null 后 垃圾收集不会清除该 DataTable 使用的所有内存 这是一个例子 变量 Before 应等于 Removed 但事实并非如此 long Before 0
  • 如何搜索来自另一个页面模型的串联名称列表?

    我的项目中有多个模型 但在下面的屏幕中 大多数字段 属性都位于 SecurityLog 模型中 下面是我显示的官员串联列表 除了军官姓名之外 我的搜索和列标题排序功能正常 我很难合并官员姓名 因为该列表来自另一个页面模型 这是我的数据库架构
  • 实施黑名单的最有效方法

    我开发了一个 Ip 过滤器 并猜测我如何使用任何类型的 esque 数据结构开发一个非常高效且快速的黑名单过滤器 我想做的很简单 每个传入 传出连接我都必须检查被阻止的 IP 列表 IP是分散的 内存使用应该是线性的 不依赖于阻止列表的数量
  • 如何在 WinRT 中从 C++ 获取堆栈跟踪?

    我需要从 C 应用程序获取堆栈跟踪 并将其序列化为字符串 以便稍后解析 我在 Windows 上听说过的唯一 API 是 StackWalk64 它似乎不受支持 如何在 Windows 应用商店应用程序中从 C 获取堆栈跟踪 我能够调试复杂
  • ASP .Net MVC 路由:仅包含字符串 ID 的 URL

    非常简单的问题 但我找不到答案 我有默认的 controller action id 模式在我的全局 asax 我还需要一些东西会给我类似的东西www example com microsoft or www example com app
  • C# 中线程之间发送消息

    如何在线程之间发送和接收消息 例如 一种解决方案是共享并发队列 尽管它的名称 并发队列 http msdn microsoft com en us library dd267265 aspx 这将允许您将一个对象从一个线程入队 并让另一个线
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方
  • 选择数据结构

    根据需求使用不同的数据结构 但我如何知道应该使用哪种数据结构 我只是想知道如何选择合适的数据结构 谢谢 此流程图适用于 C 中的 STL 但您可以用 C 实现 STL 容器支持的任何数据结构 列表是一个链接列表 Vector是一个动态数组
  • C# 如何更改 windows.forms.listview 中的网格线颜色

    如何更改 windows forms listview 中的网格线颜色 我认为没有办法在不覆盖 Paint Event 的情况下在列表视图上执行此操作 但是 如果您能够切换到网格视图 您可以这样做 this dataGridView1 Gr
  • HTTPS文件下载C#

    我需要下载隐藏在 HTTPS 连接后面的文件 我对下载安全网站后面的文件不熟悉 我尝试使用凭据来解决此问题 但无济于事 据我所知 您需要创建并使用证书来完成此操作 但我没有找到任何示例 任何帮助表示赞赏 这就是我现在所拥有的 WebClie
  • 为什么禁止在后续私有派生类中简单提及基指针/引用?

    struct B struct D private B B fun return new D ok struct DD public D B foo return 0 error struct B B B is inaccessible 这

随机推荐

  • USB 调制解调器回显错误的字符

    我在 ttyACM0 端口上连接了 USB 调制解调器 当我打开 Minicom 之类的应用程序并尝试向其发送一些命令时 回显并不总是我输入的内容 例如 如果我输入 A 则会得到 如果我输入 T 我就会得到 T 串行端口似乎正在剥离我的传输
  • 如何使用 VBA 将图像嵌入到 Outlook 电子邮件中

    非常密切相关在outlook邮件正文中嵌入图片excel vba 我正在尝试将图像嵌入到 Outlook 电子邮件中 我正在使用以下代码片段 其中一半是从上面的帖子中窃取的 Sub PictureEmail Dim outApp As Ne
  • 只有一个 TRUE 复选框

    我有一列复选框 如果选中一个框 它将为另一个工作表中的单元格设置一个值 如果我选中 1 号框 它就会变为 true 而其余的仍然为 false 然后 如果我选中 2 号框 它也会随着 1 号框而变为 true 而其余的仍然为 false 这
  • DocuSign 认证的严格性

    来自 DocuSign API 要求信息 Y 我们的 API 认证审核涉及验证您是否每 15 分钟每个唯一信封的状态请求不超过 1 个 以便对以下方法进行轮询合规性 REST API GET accounts accountId envel
  • Windows 窗体中的多个用户

    我正在做一个项目 我需要一些实施想法 到目前为止我使用的是Windows 窗体 该应用程序将由同一台电脑上的不同用户使用 我不是一个善于交际的人 所以我会给你一个场景 1 该应用程序首先显示一个登录表单 2 用户 John 进入应用程序并通
  • 如何解决 JetBrains WebStorm“未解析的变量 webServ”警告?

    我正在利用WebStorm集成开发环境对于 Node js 开发 我正在尝试清除所有 WebStorm 警告和错误 剩下的错误是 未解析的变量 webServ 警告 但 req params webServ 的使用是正确的 我不想只删除 W
  • 如何在 C# 中将默认的 FlushMode 更改为 Commit?

    所以 已经说过了 如何改变FlushMode to Commit in C 我的意思是 在 Fluent NHibernate 中 FlushMode 默认设置为 Auto 所以 将 FluentMode 设置为Commit 我需要打开会话
  • 如何验证 JasperReports 中的空报表?

    我的情况是 当我无法通过查询检索 jasper 文件中的任何内容时 仍然会生成报告 我正在使用这行代码来生成报告 ByteArrayOutputStream baos new ByteArrayOutputStream JasperPrin
  • 重新抛出异常:为什么该方法在没有 throws 子句的情况下编译?

    在下面的源代码中我重新抛出一个Exception 为什么没有必要把throws方法签名上的关键字 public void throwsOrNotThrowsThatsTheQuestion try Any processing catch
  • 如何将 UserControl 放入 Visual Studio 工具箱

    我在项目中制作了一个用户控件 构建项目后 我需要将其放入我的工具箱中 并将其用作常用控件 但我不能 这UserControl位于我的项目命名空间中 我尝试过Choose Item在右键菜单中 但我没有找到添加它的方法 我在让它们自动添加到工
  • 在冻结图上使用 optimize_for_inference.py 后使用模型时出错

    我正在使用tensorflows script optimize for inderence py on the ssd mobilenet v1 coco model使用以下命令 python m tensorflow python to
  • ASP.NET 应用程序引发的 System.Security.SecurityException

    尝试部署 ASP 应用程序 它工作了一段时间 但每当访问该页面时就开始出现错误 AppNameHere 应用程序中的服务器错误 安全异常描述 应用程序试图执行 安全策略不允许的操作 为了授予此 申请所需权限请联系您的系统 管理员或更改应用程
  • Python 无法识别 MacPorts 安装的软件包

    预先感谢您的建议 背景 相对于这个网站上的人 我对编程很陌生 尽管进行了一些研究 但我不熟悉使用 Unix 类型的 shell 管理包真正涉及的内容 或者在 Java 博士 之外完成的任何事情 IDE 或默认 R GUI 我有一台 2008
  • Git 推送收到“错误:拒绝更新签出分支”

    这是我到目前为止所做的 我成功地将远程存储库克隆到本地计算机上的新目录 然后我在工作副本中编辑了一个文件 提交它 并尝试将其推送到远程存储库 这是我得到的错误 git push origin master email protected s
  • C++ FSM 设计和所有权

    我想为此语法实现一个 FSM 下推自动机 解析器 具有范围和条件的解析器已经被 lexed 到有限状态机解析器 我有以下内容 class State public virtual State event const string token
  • 该网站如何修复编码?

    我正在尝试将这段文字 进入这段文字 不知何故 这个网站 http www pixiesoft com flip 可以做到 我想知道我自己如何做到这一点 使用任何编程语言或软件 仅将文件另存为 UTF8 是不行的 我提出这个问题的动机是 我有
  • 为什么没有相当于WillCascadeOnDelete的更新?

    当您在 EF 代码优先中设置一 多关系时 您可以选择它是否应该在删除时级联 如下所示 modelBuilder Entity
  • Redis 插入乱序,或者排序奇怪?

    我有一些代码是这样写的 foreach models as model Redis hset model App ServiceModel model primaryKey json encode model gt toArray 模型按
  • 在 DropDownListFor 上添加搜索功能

    我想知道是否有人可以帮助我解决我面临的问题 我正在尝试使用 razor 在 DropDownListFor 上创建搜索 private List
  • ASP.NET Identity OWIN 中间件 Google OAuth2 AuthenticationManager 登录不起作用

    我创建了一个简单的 ASP NET MVC4 网站来测试新的 OWIN 身份验证中间件 我决定从 Google OAuth2 开始 我在配置方面遇到了很大的困难 但我设法让 Google 授权用户 我现在遇到的问题是 OWIN 未对用户进行