【问题标题】:Authentication & Authorization with WPF Client to MVC 4 Web Api使用 WPF 客户端对 MVC 4 Web Api 进行身份验证和授权
【发布时间】:2013-05-07 18:37:33
【问题描述】:

我在 VS 2012 中使用 Entity Framework Code-First 和 WPF-Application 作为客户端创建了一个 MVC 4 Web Api。

我目前正在努力解决的问题是我必须从客户端启用身份验证并授权用户访问 Api(例如:每个经过身份验证的用户都可以访问 GET 方法,但只有管理员可以使用 POST 或 DELETE )。我使用了 MVC 4 Internet 应用程序,因为已经包含表单身份验证,在我尝试从客户端应用程序登录之前,它运行良好。在花了一些时间研究我的问题后,我意识到表单身份验证主要应该与网络浏览器一起使用。我什至找到了一些可能的解决方案,让它使用 CookieContainers 与 HttpClient 一起工作(例如:How do I set a cookie on HttpClient's HttpRequestMessage),但对我没有任何作用。
在花了几个小时研究完成我想做的事情的方法之后,我觉得完全被卡住了..
我读过有关 SimpleMembershipprovider、BasicAuthentication、OAuth 和有人提到 Thinktecture.Identitymodel 的文章,但我并不能真正决定哪个最有效。
如果在与网络浏览器以外的客户端连接时确实无法使用表单身份验证,那么最好的身份验证/授权方法是什么?

如果有人能向我提供有关在这种情况下最有效的方法的提示,我将非常高兴,因为在研究了几个小时后,我只会越来越困惑。

提前感谢您的帮助!

【问题讨论】:

    标签: c# authentication asp.net-mvc-4 dotnet-httpclient


    【解决方案1】:

    您应该能够很容易地做到这一点,但您还没有说出您的问题究竟是什么。你是吗

    1. 由于您未登录,无法访问您的 Web api 操作;或
    2. 无法使其强制执行授权(即您可以匿名访问操作)

    对于第二种情况:

    对在服务器端使用Authentication and Authorization in ASP.NET Web API 以及在操作上强制执行不同角色的各种方式有一个很好的概述。

    Making your ASP.NET Web API’s secure 中还有另一种适用于机器对机器的方法(即,您没有将登录详细信息输入应用程序对话框的用户),但它不关注关于使用 SimpleMembershipProvider。它使用令牌而不是使用框架 auth&auth 组件(请注意这种方法 - 滚动您自己的安全性非常非常难以做到正确)。

    对于第一种情况:

    从客户端,听起来您有一个用户与之交互的 C# 应用程序。如果是这种情况(而不是机器对机器的场景),那么您的基于表单的方法仍然是合适的,并且您正在使用 cookie 做正确的事情。方法是:

    • 要求客户在您的应用程序中输入他们的用户名和密码
    • 向 AccountsController 上的 LogIn 操作发送请求,这将返回您的身份验证 cookie、会话 cookie 等。
    • 存储从该(成功)登录返回的 cookie(或如果响应为“登录失败”则通知客户端
    • 然后在对 web api 的请求中使用这些 cookie

    由于您已经在谈论使用HttpClient,我猜您知道您为此做了什么,所以没有提供代码示例。我不会使用HttpClient,因为它的价值,但HttpWebRequest 允许您通过HttpWebRequest.CookieContainer 属性保持一个共同的CookieContainer

    【讨论】:

    • 您好,感谢您的回复,很抱歉我的问题听起来和我当时一样困惑。
    • 我的问题确实是我无法让用户从 C# 应用程序登录。但更努力地我终于找到了一种让它工作的方法。目前,我将登录数据发送到 API 并获取 cookie,然后将这些 cookie 传递给公开 HttpClient 属性的类,并使用 HttpClientHandler 和 CookieContainer 初始化 HttpClient。然后我将此属性用于对 Web Api 的任何请求,它工作正常。现在我不太确定如何处理默认 MVC 4 Internet Application 登录方法的返回类型 ActionResult 以确定登录是否成功。
    • @Scorch。我可能会构建一个专门为您的客户端设计的登录方法,这样您就可以返回枚举或结构化结果以显示登录是否成功,或者使用标准的 http 返回代码来表示相同。
    • 再次感谢您的回复!下次上班的时候我会试试看的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2015-08-08
    • 2012-12-31
    • 1970-01-01
    • 2019-06-21
    • 2016-02-10
    相关资源
    最近更新 更多