gpt4 book ai didi

c# - 您如何手动设置登录身份用户?

转载 作者:太空狗 更新时间:2023-10-29 21:21:33 25 4
gpt4 key购买 nike

我在 ADFS 服务器上使用 ASP.NET Identity。出于开发目的,我想避免在无法访问 ADFS 服务器的网络环境中使用 ADFS 服务器。这就是为什么我在我的 HomeController 中添加了一个简单的 Controller 操作来手动设置当前登录的用户:

#if DEBUG
[AllowAnonymous]
public ActionResult LogIn()
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, "tester"));

System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity(claims));
System.Threading.Thread.CurrentPrincipal = System.Web.HttpContext.Current.User;

return Redirect("Home/Index");
}
#endif

以及 Owin 配置方法:

public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(new CookieAuthenticationOptions() { });

app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
}

注释掉我使用 WsFederation 身份验证的部分没有问题,这样就没有指向我当前 ADFS 服务器的链接。

问题:当我被重定向到 Home/Index 操作(具有 Authorize 属性)时,ASP.NET Identity 无法将我的 ClaimsPrincipal 识别为有效登录,因此我被重定向到 Home/Login Action ,它不断地在 Home/Login 和 Home/Index 之间创建一个循环。

我的问题:如何让 ASP.NET 接受上面创建的 ClaimsPrincipal 作为有效登录?

最佳答案

您的方法有问题 - 未设置 cookie,因此不会在 HTTP 请求中保留用户信息。您的方法仅在一次调用中有效(有一些用途,但不适合您)

您仍然可以使用 OWIN 中的 IAuthenticationManager 来设置 cookie:

#if DEBUG
[AllowAnonymous]
public ActionResult LogIn()
{
var identity = new ClaimsIdentity("ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "Active Directory"));
identity.AddClaim(new Claim(ClaimTypes.Name, "Testy McTestface"));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "testUser"));

IAuthenticationManager authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut("ApplicationCookie");
authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);

return Redirect("Home/Index");
}
#endif

您将需要 nuget 包 Microsoft.Owin.Security.CookiesMicrosoft.Owin.Host.SystemWeb。在我的 blog-post 中查看更多解释关于使用 AD 进行身份验证

您还需要确保 CookieAuthenticationMiddleware 配置正确:

 public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Home/Login"),
Provider = new CookieAuthenticationProvider(),
CookieName = "ApplicationCookie",
CookieHttpOnly = true,
ExpireTimeSpan = TimeSpan.FromHours(1),
});

app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
}

特别是向 AuthenticationType 值支付身份验证 - 它必须与 ClaimsIdentity 构造函数中的值匹配。否则将不会设置 cookie,或者您将无法登出。

关于c# - 您如何手动设置登录身份用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38371066/

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