gpt4 book ai didi

c# - 在 2 个 ASP.NET MVC 项目之间使用 ASP.NET Identity 进行单点登录

转载 作者:太空狗 更新时间:2023-10-29 17:50:23 29 4
gpt4 key购买 nike

我有 2 个 Web 应用程序,它们都共享下面提到的相同主级域,因此我可以共享 cookie。两个项目中的 Web.conifg 具有相同的机器 key 和验证 key 。因为,我想使用 Identity 和 NOT 形式的 authenticaiton,所以我的两个 web.config 文件中都没有节点。我能够从 SSO 成功创建 Auth cookie,并且可以在 SSO 中查看授权页面,但是当我尝试访问 MVC 项目中的授权 View 时,我仍然被重定向到 SSO 登录。

  1. sso.domain.com - MVC 项目
  2. mvc.domain.com - MVC 项目

我的 SSO 和 MVC 项目中有一个 startup.cs 文件,如下所示:

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

// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
ExpireTimeSpan = TimeSpan.FromMinutes(3),
LoginPath = new PathString("/Login"),
CookieName = "MyCookieName",
CookieDomain = ".domain.com"
});

app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
}
}

下面是我目前在 AccountController.cs 下的 SSO 项目中的代码。我调用下面的 IdentitySignin 函数来根据创建 cookie 的数据库验证用户:

        private void IdentitySignin(string userId, string name, string providerKey = null, bool isPersistent = false)
{
var claims = new List<Claim>();

// create *required* claims
claims.Add(new Claim(ClaimTypes.NameIdentifier, userId));
claims.Add(new Claim(ClaimTypes.Name, name));

var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);


//get the expiry minutes from config or use the default value of 30 minutes
double expiryMinutes;
expiryMinutes = double.TryParse(ConfigurationManager.AppSettings["AuthCookieExpiryMinutes"], out expiryMinutes) ? expiryMinutes : 30;

// add to user here!
AuthenticationManager.SignIn(new AuthenticationProperties()
{
AllowRefresh = true,
IsPersistent = isPersistent,
ExpiresUtc = DateTime.UtcNow.AddMinutes(expiryMinutes),
IssuedUtc = DateTime.UtcNow
}, identity);
}

private void IdentitySignout()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie);
}

private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}

private async Task<string> GetVerifiedUserIdAsync()
{
var result = await AuthenticationManager.AuthenticateAsync(
DefaultAuthenticationTypes.ApplicationCookie);

if (result != null && result.Identity != null
&& !String.IsNullOrEmpty(result.Identity.GetUserId()))
{
return result.Identity.GetUserId();
}
return null;
}

最佳答案

因此,我想出了单点登录无法在 2 个 MVC 应用程序之间工作的原因,尽管它们共享同一台机器和验证 key 。

我的 SSO MVC 应用程序和其他 MVC 应用程序都使用不同版本的 OWIN 和 ASP.NET Identity DLL。我在一个项目中使用 Nuget 更新了 DLLS,但在另一个项目中没有进行更新。

我希望这对遇到这个问题的人有所帮助。

仅供引用,要在多个应用程序之间共享 ASP.NET Identity Authentication,请确保您在 EACH APP 中具有以下内容:

  1. web.config 文件中的相同机器 key 和验证 key
  2. 相同版本的 OWIN 和 ASP.NET IDENTITY DLL
  3. Startup.cs 中的 COOKIE 名称和 COOKIE 域相同
  4. 两个应用程序需要在同一个域中才能共享身份验证 cookie

关于c# - 在 2 个 ASP.NET MVC 项目之间使用 ASP.NET Identity 进行单点登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42229847/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com