MVC4 如何设置 cookie 然后重定向到操作

2024-06-19

您好,我正在尝试获取用户角色并将其设置为我的应用程序中的 cookie

我有以下有效的代码

public ActionResult Index()
    {
        var user = User.Identity.Name;  // set by 3rd party central login in manager

        // key to check that we are in our environment with 3rd party login set up
        if (ConfigurationManager.AppSettings["IsNGDC"] == "true")
        {
            // ActiveKey login
            if (user.Contains("uid="))
            {
                var endIndex = user.IndexOf(",ou");

                var userEmail = user.Substring(4, endIndex - 4);
                user = userEmail;
            }

            SetAuthenticationCookie(user);
        }

        // view model is not needed I could just pass in a string
        var viewModel = new SiteminderViewModel { Username = user };

        if (ModelState.IsValid)
        {
            this.AssignRoles(viewModel);
            return this.View();
        }

        return View(viewModel);
    }

我需要更改此设置,因为我使用的是动态导航栏,该导航栏根据用户角色显示不同的项目,并且在用户刷新页面之前它不会显示正确的导航栏。我认为这是因为视图使用了 cookie,并且视图是在设置 cookie 的同一操作中呈现的。

我想在控制器中将其分为 2 个操作,如下所示

    public void LogIn()
    {
        var user = User.Identity.Name;  // set by 3rd party central login in manager

        // key to check that we are in our environment with 3rd party login set up
        if (ConfigurationManager.AppSettings["IsNGDC"] == "true") 
        {
            // ActiveKey login
            if (user.Contains("uid="))
            {
                var endIndex = user.IndexOf(",ou");

                var userEmail = user.Substring(4, endIndex - 4);
                user = userEmail;
            }

            SetAuthenticationCookie(user);
        }

        // view model is not needed I could just pass in a string
        var viewModel = new SiteminderViewModel { Username = user };

        this.AssignRoles(viewModel);

        // default URL in Index action for this controller
        this.Response.Redirect(FormsAuthentication.DefaultUrl, false);
    }

    public ActionResult Index()
    {
        ViewBag.Message = "Home App Description here";
        return this.View();
    }

当我尝试这个时,看起来 Cookie 尚未设置。不幸的是,由于第 3 方登录,我只能在生产环境的复制上测试此代码,因此我的调试信息有限。据我所知,问题似乎出在我的重定向方式上。

我提供了用于创建 cookie 和分配角色的方法(如下)。

附加信息

    private void SetAuthenticationCookie(string username)
    {
        var tkt = new FormsAuthenticationTicket(1, username, DateTime.UtcNow, DateTime.UtcNow.AddMinutes(20), true, string.Empty);
        var encryptedTkt = FormsAuthentication.Encrypt(tkt);

        var formsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTkt);
        this.Response.Cookies.Add(formsCookie);
    }

    private void AssignRoles(SiteminderViewModel viewModel)
    {
        var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        var ticket = authCookie != null ? FormsAuthentication.Decrypt(authCookie.Value) : new FormsAuthenticationTicket(1, viewModel.Username, DateTime.UtcNow, DateTime.UtcNow.AddMinutes(20), true, string.Empty);
        var user = this.userRepository.GetUser(viewModel.Username);

        if (user != null)
        {
            var principleProperties = new PrincipleProperties(ticket.UserData)
            {
                UserName = user.Email,
                UserRole = user.UserGroup.Role.Name.Replace(" ", string.Empty),
                ContextId = contextRepository.GetContextByDataOwnerGroupId(user.UserGroupId)
            };

            if (user.DeletedIndicator)
            {
                principleProperties.UserRole = string.Empty;
            }

            this.SetPrinciple(ticket, principleProperties);
        }
    }

    private FormsAuthenticationTicket SetPrinciple(FormsAuthenticationTicket ticket, PrincipleProperties properties)
    {
        var newticket = new FormsAuthenticationTicket(
            ticket.Version,
            ticket.Name,
            ticket.IssueDate,
            ticket.Expiration,
            ticket.IsPersistent,
            properties.Serialize(),
            ticket.CookiePath);

        var encryptedTkt = FormsAuthentication.Encrypt(newticket);

        var formsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTkt);
        this.Response.Cookies.Set(formsCookie);

        var referenceDataIdentity = new ReferenceDataIdentity(ticket);
        var principle = new ReferenceDataPrinciple(referenceDataIdentity, properties);

        Thread.CurrentPrincipal = principle;
        return newticket;
    }

解决方案是 cookie 没有被添加到浏览器,因为我在 cookie 到达客户端之前进行了重定向,解决方案是让登录操作返回一个空白视图,然后从视图内部重定向到索引操作我的代码的最终版本如下NOTE: 登录名更改为 AuthenticateUser

    public ActionResult Index()
    {
        var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            var ticket = FormsAuthentication.Decrypt(authCookie.Value);

            if (ticket != null && ticket.UserData != string.Empty)
            {
                return this.View();
            }
        }

        return RedirectToAction("AuthenticateUser");
    }

    public ActionResult AuthenticateUser()
    {
        // set by Site minder
        var user = User.Identity.Name;

        // ActiveKey login
        if (user.Contains("uid="))
        {
            var endIndex = user.IndexOf(",ou");

            var userEmail = user.Substring(4, endIndex - 4);
            user = userEmail;
        }

        SetAuthenticationCookie(user);


        var viewModel = new SiteminderViewModel { Username = user };

        this.AssignRoles(viewModel);
        return this.View();
    }

观点是。没有可显示的 HTML,因此重定向不明显。

@{
    ViewBag.Title = "AuthenticateUser";
    Layout = null;
    Response.Redirect( Url.Action("Index", "Home"), false);
}

此代码检查是否存在 cookie 并且用户数据不为空,如果这些检查通过,则会向用户显示主页。否则,它会重定向到身份验证操作,该操作获取由我们的第 3 方中央登录软件在浏览器中设置的电子邮件地址,并从用户详细信息中获取用户详细信息。如果用户不在我们的用户表中,他们将被授予基本访问权限。

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

MVC4 如何设置 cookie 然后重定向到操作 的相关文章

  • 如何正确链接不同View之间

    我有一个master cshtml带有导航栏 我的第一个链接是另一个视图 ProjectManagement li a href Views ProjectManagement cshtml Project Management a li
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • iOS 中如何清除特定域的 cookie?

    我已经搜索了 StackOverflow 上的几乎所有问题来寻找我的问题的答案 我还没有找到任何有用的链接或教程来说明哪种方式最好清除特定域的 cookie 如果有人可以帮助我 请 我自己找到了解决方案 如果您想删除 UIWebView 中
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • Elmah 不会在 MVC 应用程序中记录 http post 请求的异常 - 如果请求包含 XML

    我在 MVC4 RC 应用程序中遇到了一个奇怪的问题 在 NET 4 0上运行 我刚刚设置 Elmah 来记录异常 错误 我基本上安装了埃尔玛MVC and elmah sqlserverNuGet 包 分别为2 0 0和1 2版本 它似乎
  • SSL 和会话劫持/固定

    快问 SSL 是否完全防止会话劫持 固定 谢谢 不可以 例如 在以下情况下可能会发生劫持 被黑客入侵的 CA 根签署无效证书 该证书可用于发起中间人攻击 被黑客攻击的域名所有者电子邮件收件箱使黑客有可能购买经过域名验证的证书 错误的密钥策略
  • 使用 401 发送消息:Asp.net Web-api

    我在 ASP NET Web API 中 在登录方法中 我根据数据库检查用户 密码 如果它们不匹配 我将返回 401 状态代码以及invalid user or password method like var content new St
  • 将自定义参数传递给 ValidationAttribute

    我构建了一个自定义 ValidationAttribute 以便可以验证系统中的唯一电子邮件地址 但是 我想以某种方式传递自定义参数 以便为我的验证添加更多逻辑 public class UniqueEmailAttribute Valid
  • google apps 脚本 ==> UrlFetchApp、方法 GET 和 cookie

    我使用 UrlFetchApp 发送用户和密码 POST 方法 获取cookie后 并在其他请求中使用 GET方法 但是这个新请求不起作用 我认为这个 cookie 在这个新请求中没有正确使用 谁能帮我 var opt method pos
  • 使用 cookie 制作 Ruby Net::HTTP::Get 请求

    我想通过 ruby 打开我的 stackoverflow com 页面 我希望看到它就好像我已经过身份验证一样 I took usr来自 Google Chrome 的 cookie 并创建了以下代码片段 require net http
  • 在 ASP.NET MVC 项目中,是否可以在不使用参数的情况下通过 RedirectToAction 传递数据?

    在我的 ASP NET MVC 项目的控制器中 我有一个 return RedirectToAction CreatePerson Home 这个视图是一个创建人的表单 并且运行良好 但是 我想要 RedirectToAction 并使用从
  • 如何在 Azure 上的 MVC 应用程序中托管和嵌入视频?

    我创建了一个基本应用程序并上传到 Azure 我想嵌入视频 以便用户可以从列表中进行选择并查看每个视频 例如 选择一部电影并观看其预告片 我在 MVC 解决方案中创建了两个文件夹 Posters 包含用作每个视频背景的 jpg 文件 Vid
  • 我的 cookie 仅在设置它们的 PHP 页面上可用,这正常吗?

    我无法从设置 cookie 的页面以外的任何页面访问 cookie 我在看print r COOKIE 在不同的页面上 页面之间唯一的公共变量是 COOKIE PHPSESSID 我正在本地 XAMPP 测试服务器上进行开发 我应该更改 P
  • 断开客户端与服务器端信号器的连接

    我将 SignalR 1 与带有表单身份验证的 MVC4 C Web 应用程序一起使用 我的布局页面中有一段 JavaScript 代码 documnet ready function connect to hub code 我想断开用户与
  • Kendo ui - 如何将验证与 mvc 模型属性联系起来

    通过阅读本文中的帖子thread http www kendoui com forums framework validation using kendo validator with mvc model properties aspx 由
  • 在winforms中用HttpWebRequest传递cookie?

    请看下面的代码 objCookieContainer new CookieContainer HttpWebRequest request HttpWebRequest WebRequest Create http website com
  • PHP 会话 ID——它们是如何生成的? [复制]

    这个问题在这里已经有答案了 当我打电话时session start or session regenerate id PHP 为会话 ID 生成看似随机的字符串 我想知道的是 它只是一个随机的字符序列 还是像uniqid 功能 因为如果只是
  • 将 cookies.txt 文件与 Python 请求结合使用

    我正在尝试使用访问经过身份验证的网站cookies txt带有 Python 请求的文件 使用 Chrome 扩展生成 import requests cookielib cj cookielib MozillaCookieJar cook
  • tomcat cookie域验证

    我正在使用 tomcat 8 0 21 和新的 Rfc6265 cookie 处理器 如果有以点开头的 cookie 我会收到以下错误 java lang IllegalArgumentException An invalid domain
  • 使用 Javascript 基于 Cookie 的重定向

    我正在尝试根据 cookie 的存在创建重定向 所以当用户连接到我的网站时jonathanstevens org他们第一次被重定向到jonathanstevens org landing 代码部分 Global js function cr

随机推荐

  • SQL:如何在按部分分组的查询中使用子查询?

    如何在按部分分组的查询中使用子查询 我使用 SQL Server 2008 R2 和 Delphi 2010 我收到此错误 Cannot perform an aggregate function on an expression cont
  • Spinner onItemSelected 被错误调用(无需用户操作)

    我有一个在对话框视图中显示的微调器 对话框开始时onItemSelected叫做 我真的不想处理这个 但只有当用户做出选择时 所以我要么需要阻止这种情况 也许是因为没有设置默认值 要么我需要知道不是用户在做出此选择 本着比尔 莫特解决方案的
  • Android:如何在 Android 中访问电子邮件地址

    我有以下代码 通过它我可以检索电话号码 不知何故 我无法使用 android provider Contacts People API 检索电子邮件地址 有任何想法吗 import android app AlertDialog impor
  • 带填充的 Tailwind CSS 导航悬停下拉菜单

    我正在尝试展示子 ul 当项目悬停时 在第一个导航项目上列出 一切正常 除了有时 时好时坏 当您位于第一行的填充之间时 ul 项目和子项目 ul 项目 次要项目 ul 会消失 当我从下拉菜单导航到项目列表时 如何保持辅助导航列表打开 JSF
  • 如何安装 grunt-cli 而不出现错误?

    灵感来自 Chris Coyierpost http 24ways org 2013 grunt is not weird and hard 我决定尝试一下 grunt 但我在设置时遇到了很大的问题 首先 我安装了 Node js 然后我将
  • 使用 BinaryWriter 将一位写入二进制文件

    我想将一位写入二进制文件 using FileStream fileStream new FileStream myfile bin FileMode Create using BinaryWriter binaryWriter new B
  • 无法在 IBM Mobilefirst Platform Test Workbench 8.7(免费版本)中引用数据池测试

    使用的工具 IBM Mobilefirst Platform Test Workbench 8 7 免费版 OS Windows 7的 问题描述 1 在测试工作台中以记录模式创建测试用例 针对登录场景 2 插入一个新的数据池 并向数据池中的
  • 模拟比存根更好吗?

    不久前我读到了模拟不是存根 http www martinfowler com articles mocksArentStubs htmlMartin Fowler 的文章 我必须承认我有点害怕外部依赖性增加的复杂性 所以我想问 单元测试时
  • 如何解决下载时“失败 - 无文件”的问题?

    我正在尝试设置适用于 Chrome 和 IE 10 11 的下载文件 它在大多数情况下适用于普通文件类型 EXE PNG TXT 等 但当尝试下载没有文件类型的文本文件或 000 等随机类型时 它将失败 显示 失败 否 文件 有谁知道可能导
  • 扩展 Protobuf 消息

    我有许多不同的模式 但是每个模式都包含一组字段 我想知道是否有一种方法可以让不同的模式扩展父模式并继承其字段 例如 这就是我想要的 message Parent required string common1 0 optional stri
  • 多个 MapFragment 的性能(Android Map API v2)

    我搜索了新的文档谷歌 Android 地图 API v2 https developers google com maps documentation android 但没有找到任何相关信息 在 v2 之前 我们 官方 无法正确显示每个应用
  • Ubuntu 中的颜色选择器实用程序(颜色移液器)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用脚本从网站中提取电子邮件地址

    给定一个网站 我想知道以编程方式和 或使用脚本的最佳程序是什么 以纯文本形式提取每个页面上存在的所有电子邮件地址 电子邮件受保护 cdn cgi l email protection从该链接和下面的所有站点 递归或直到某个固定深度 使用 s
  • 在网站上不间断地播放 mp3?

    客户请求在整个网站上播放单个曲目 一般来说 我建议不要这样做 但他们坚持这样做 那么 将 Flash 播放器嵌入到网站中并且当用户转到另一个页面时不会出现间隙 中断的最直接方法是什么 我认为需要一个 iframe 我正在使用具有自动恢复功能
  • iPhone OS:从匿名对象获取方法和变量列表

    我正在构建我的第一个 iPhone Obj c 应用程序 并且我有大量的数据保存子类 我将它们传递给引用函数 对于 cite 函数 这些对象是匿名的 我需要找到一种方法来访问每个传递对象的所有变量 我一直在使用预构建的 NSArray 和选
  • 如何在 Ruby 中创建自定义排序方法

    我想指定一个自定义块方法 通过评估两个属性来对对象数组进行排序 然而 经过多次搜索 我没有找到任何没有的例子 lt gt 操作员 我想比较a to b if a x less than b x return 1 if a x greater
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • AttributeError:“模块”对象没有属性“TestCase”

    我有名为 test py 的unittest 文件 My code import unittest class Test unittest TestCase def myTest self a 1 self assertEqual a 1
  • 将 std::stack .pop() 方法的结果存储到变量中

    我想做以下事情 std stack
  • MVC4 如何设置 cookie 然后重定向到操作

    您好 我正在尝试获取用户角色并将其设置为我的应用程序中的 cookie 我有以下有效的代码 public ActionResult Index var user User Identity Name set by 3rd party cen