gpt4 book ai didi

c# - 如何在 ASP.Net MVC 应用程序中使用来自 WCF 身份验证服务的身份验证 cookie

转载 作者:可可西里 更新时间:2023-11-01 07:57:03 25 4
gpt4 key购买 nike

好吧,我没能找到适合我的特定场景的任何文档或教程。

我有一个 ASP.Net MVC web 应用程序,它将使用 WCF 服务来处理所有内容,包括身份验证和角色(通过 WCF 后端上的成员提供程序)。

我没遇到过问题setting up the authentication services但它不会在网络应用程序中设置 cookie。 Login method of the service 的文档表明连接 CreatingCookie 事件是可能的,但它对客户端没有任何影响(我也在服务端尝试过,同样没有影响)。所以我想出了如何capture the cookie .我曾尝试在客户端手动设置 auth cookie,但到目前为止还没有用;由于填充,解密失败,并且客户端无法读取服务器给定的 cookie 值。

有人知道您应该如何使用 WCF 身份验证服务生成的 cookie 吗?我是否只是假设 session 全部在 WCF 服务器上管理,并在每次页面加载时检查服务上的 IsLoggedIn()?

提前致谢。

最佳答案

我最近一直在尝试实现您所描述的相同功能。我已经设法让它与以下代码一起工作:

    private readonly AuthenticationServiceClient service = new AuthenticationServiceClient();

public void SignIn(string userName, string password, bool createPersistentCookie)
{
using (new OperationContextScope(service.InnerChannel))
{
// login
service.Login(userName, password, String.Empty, createPersistentCookie);

// Get the response header
var responseMessageProperty = (HttpResponseMessageProperty)
OperationContext.Current.IncomingMessageProperties[HttpResponseMessageProperty.Name];

string encryptedCookie = responseMessageProperty.Headers.Get("Set-Cookie");

// parse header to cookie object
var cookieJar = new CookieContainer();
cookieJar.SetCookies(new Uri("http://localhost:1062/"), encryptedCookie);
Cookie cookie = cookieJar.GetCookies(new Uri("http://localhost:1062/"))[0];

FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
if (null != ticket)
{
//string[] roles = RoleManager.GetRolesFromString(ticket.UserData);
HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket), null);
FormsAuthentication.SetAuthCookie(HttpContext.Current.User.Identity.Name, createPersistentCookie);
}
}
}

它完全按照您对问题的评论所述进行操作。

编辑

我在这里发布此代码的服务器端部分以供引用。

public class HttpResponseMessageInspector : BehaviorExtensionElement, IDispatchMessageInspector, IServiceBehavior
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{

HttpRequestMessageProperty httpRequest = request.Properties[HttpRequestMessageProperty.Name]
as HttpRequestMessageProperty;

if (httpRequest != null)
{
string cookie = httpRequest.Headers[HttpRequestHeader.Cookie];

if (!string.IsNullOrEmpty(cookie))
{
FormsAuthentication.Decrypt(cookie);
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(cookie);
string[] roles = PrincipalHelper.GetUserRoles(authTicket);
var principal = new BreakpointPrincipal(new BreakpointIdentity(authTicket), roles);

HttpContext.Current.User = principal;
}
// can deny request here
}

return null;
}
}

关于c# - 如何在 ASP.Net MVC 应用程序中使用来自 WCF 身份验证服务的身份验证 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587645/

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